Skip to content

Commit b618d3a

Browse files
committed
fix: acceleration of generation + major update of comments, improvement of documentation in the PseudoRandom class
1 parent d9e8605 commit b618d3a

1 file changed

Lines changed: 12 additions & 18 deletions

File tree

pycustomrand/random_generator.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66

77
class PseudoRandom:
8-
# Переменная класса для хранения seed генератора псевдослучайных чисел
8+
# Переменная класса для хранения зерна генератора (seed) псевдослучайных чисел
99
_seed = None
1010

11-
# -------------------- Основные функции генерации случайных чисел --------------------
11+
# -------------------- Основные функции генератора --------------------
1212

1313
@classmethod
1414
def set_seed(cls, seed: Any = None) -> None:
1515
"""
16-
Установка нового значения seed.
16+
Установка нового значения зерна (seed).
1717
1818
seed - любой объект, который преобразуется в строку. Если None - сброс на время (time_ns()).
1919
"""
@@ -25,8 +25,8 @@ def set_seed(cls, seed: Any = None) -> None:
2525
@staticmethod
2626
def _get_next_seed_state(current_seed: int) -> int:
2727
"""
28-
Вспомогательная функция - меняет состояние зерна с помощью линейного конгруэнтного метода.
29-
(Константы взяты из Borland C/C++ runtime library.)
28+
Вспомогательная функция - меняет состояние зерна (seed) с помощью линейного конгруэнтного метода.
29+
Константы взяты из Borland C/C++ runtime library.
3030
"""
3131
return (current_seed * 22695477 + 1) & 0xFFFFFFFF
3232

@@ -39,7 +39,7 @@ def gen_random_number(cls, length: int = 1) -> int:
3939
if cls._seed is not None:
4040
is_seeded = True
4141
current_entropy = cls._seed
42-
# Обновление seed для следующей итерации (цифры), иначе результат будет одинаковым
42+
# Обновление seed для следующей итерации (цифры), иначе результат генерации будет одинаковым
4343
cls._seed = cls._get_next_seed_state(cls._seed)
4444
else:
4545
is_seeded = False
@@ -53,9 +53,9 @@ def gen_random_number(cls, length: int = 1) -> int:
5353
# Добавление последней цифры результата
5454
number += str(int(magic_result))[-1]
5555

56-
# Если нет seed, нужна задержка, чтобы время изменилось (т.к. entropy - время)
56+
# Если нет seed, то entropy - время, поэтому нужна задержка для случайности выпадения чисел
5757
if not is_seeded:
58-
sleep(0.0001)
58+
sleep(0.0000001)
5959

6060
return int(number)
6161

@@ -100,18 +100,14 @@ def random_integer(start: int, end: int = None, step: int = 1) -> int:
100100
step (опциональный аргумент) - число должно делиться на step (относительно start)
101101
"""
102102
if step == 0:
103-
raise ValueError("Step (шаг) не может быть равен 0")
103+
raise ValueError("Шаг (step) не может быть равен 0")
104104

105-
# Длина диапазона
106105
width = end - start
107-
108-
# Количество шагов = (разница / шаг) + 1
109106
n_steps = int(width / step) + 1
110107

111108
if n_steps <= 0:
112109
raise ValueError("Неверные границы диапазона для заданного шага")
113110

114-
# Выбор случайного индекса шага
115111
random_step_index = int(PseudoRandom.random() * n_steps)
116112

117113
return start + (random_step_index * step)
@@ -183,8 +179,7 @@ def choice(array: list[Any]) -> Any:
183179
"""Возвращает случайно выбранный элемент из массива."""
184180
if not array:
185181
return None
186-
index = PseudoRandom.randrange(len(array))
187-
return array[index]
182+
return array[PseudoRandom.randrange(len(array))]
188183

189184
@staticmethod
190185
def choices(array: list[Any], k: int, weights: list[int] = None) -> list[Any]:
@@ -248,7 +243,7 @@ def sample(array: list[Any], k: int, counts: list[int] = None) -> list[Any]:
248243
def binomialvariate(n: int = 1, p: float = 0.5) -> int:
249244
"""
250245
Возвращает случайное число, распределённое по биномиальному закону.
251-
Простейшая реализация, неоптимизированная.
246+
Простейшая реализация (неоптимизированная).
252247
253248
n - количество испытаний (целое число >= 0).
254249
p - вероятность успеха в каждом испытании (0.0 <= p <= 1.0).
@@ -275,8 +270,7 @@ def random_uuid4() -> str:
275270
Пример: 'f47ac10b-58cc-4372-a567-0e02b2c3d479'
276271
"""
277272
# Генерирация 32 hex-цифры
278-
chars = [hex(PseudoRandom.random_integer(0, 15))[2:]
279-
for _ in range(32)]
273+
chars = [hex(PseudoRandom.random_integer(0, 15))[2:] for _ in range(32)]
280274

281275
# Согласно стандарту UUID v4:
282276
chars[12] = '4' # 13-й символ всегда '4'

0 commit comments

Comments
 (0)