You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+16-15Lines changed: 16 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,18 +14,18 @@
14
14
Меня не устраивало, что модуль `random` в Python генерирует недостаточно случайные числа ( *особенно при нескольких последовательных генерациях* ), а встроенный в Python модуль `round` довольно "грубо" округляет числа ( *`round(1.5)` = 2 и в то же время `round(2.5)` = 2* ), поэтому я решил написать *свою* библиотеку для генерации псевдослучайных чисел — более простую и с наибольшей энтропией.
15
15
16
16
> [!WARNING]
17
-
> PyCustomRand **не является** криптографически стойкой библиотекой и **не предназначена** для использования в системах безопасности!
17
+
> PyCustomRand *пока***не является** криптографически стойкой библиотекой и **не предназначена** для использования в системах безопасности!
## 📌 Зачем нужна эта библиотека, если есть уже встроенные в Python `random` и `round`?
21
21
PyCustomRand писался как альтернатива этим двум встроенным модулям. Вот главные особенности и возможности библиотеки:
22
22
23
-
* Данная библиотека **проще** написана — весь код закомментирован, лёгок и понятен. В основе реализации генератора псевдослучайных чисел лежит *несложный* алгоритм (использующий системное время) поэтому библиотеку легко кастомизировать/расширять/дополнять под себя.
23
+
* Данная библиотека **проще** написана — весь код закомментирован, лёгок и понятен. В основе реализации генератора псевдослучайных чисел лежит *несложный* алгоритм, использующий системное время, поэтому библиотеку легко кастомизировать, расширять или дополнять под себя.
24
24
* В большинстве своём PyCustomRand выдаёт более *"энтропичный"* результат при нескольких генерациях подряд по сравнению со встроенным `random`-модулем.
25
25
* <details>
26
26
<summary>📊 Сравнение с диаграммами</summary>
27
27
28
-
PyCustomRand демонстрирует **на 173%** более высокую кучность распределения по сравнению со стандартной библиотекой `random` в тестах на **1,000,000** итераций.
28
+
PyCustomRand демонстрирует **на 173%** более высокую кучность распределения по сравнению со стандартной библиотекой `random` в тестах на **1.000.000** итераций.
29
29
30
30
<imgsrc="https://i.imgur.com/qxYdxmD.png">
31
31
@@ -52,23 +52,23 @@ PyCustomRand писался как альтернатива этим двум в
52
52
</tr>
53
53
</table>
54
54
</details>
55
-
* Библиотека включает в себя все самые главные функции из [оригинальной](https://docs.python.org/3/library/random.html) Python-библиотеки, но только местами улучшенные и упрощённые (например: `random_integer` может выдавать сгенерированный результат, делимый на заданное число из диапазона; результат функции `random_float` можно округлять и пр.)
55
+
* Библиотека включает в себя все самые главные функции из [оригинальной](https://docs.python.org/3/library/random.html) Python-библиотеки, но только местами улучшенные и упрощённые (например: `random_integer` может выдавать сгенерированный результат, делимый на заданное число из диапазона; результат функции `random_float` можно округлять и так далее)
56
56
* <details>
57
57
<summary>📑 Список функций</summary>
58
58
59
-
* Генерация целых чисел (`random_integer`, `randrange`, `gen_random_number`).
59
+
* Генерация целых чисел (`gen_random_number`, `randrange`, `random_integer`).
60
60
* Генерация вещественных чисел (`random`, `random_float`).
61
61
* Поддержка статистических распределений: Нормальное (Гаусс), Треугольное, Экспоненциальное, Биномиальное.
62
62
* Инструменты для последовательностей: выбор случайного элемента (`choice`), выборка с весами (`choices`), перемешивание (`shuffle`) и выборка уникальных элементов (`sample`).
63
-
* Инициализация («посев») последовательности генератора псевдослучайных чисел (`set_seed`, `_get_next_seed_state`).
63
+
* Инициализация ("посев") последовательности генератора псевдослучайных чисел (`set_seed`, `_get_next_seed_state`).
64
64
</details>
65
65
* Также библиотека имеет дополнительные утилиты, полезные для разработки веба/игр: генерация UUID v4, случайных HEX-цветов (например, `#ff05a1`), случайных байт, случайных булевых значений (`True`/`False`) с настраиваемым шансом.
66
-
* Имеется модуль собственного честного округления — `true_round`. Функция округляет числа привычным математическим способом (0.5 всегда вверх по модулю), а также исправляет погрешности плавающей точки (например, "проблему 2.675").
66
+
* Имеется собственный модуль округления — `true_round`. Функция округляет числа привычным математическим способом (0.5 всегда вверх по модулю), а также исправляет погрешности плавающей точки (например, "проблему 2.675").
67
67
* Код покрыт unit-тестами (чему соответствует badge в начале README), также имеется встроенный модуль диагностики (`check_distribution`), который позволяет в любой момент проверить равномерность распределения генератора.
68
68
69
69
Да, у проекта всё же имеются некоторые минусы:
70
-
* Рандом, основанный на времени, требует небольшого ожидания (`time.sleep()` на 0.1 микросекунду), соответственно, при гигантских итерациях PyCustomRand будет уступать встроенному модулю `random` во времени.
71
-
* Некоторые функции библиотеки PyCustomRand (функции выборки, распределений) настолько просто написаны, что могут быть недостаточно оптимизированными для гигантских выборок (+ добавляется накапливающееся микро-ожидание из-за проблемы выше).
70
+
* Рандом, основанный на времени, требует небольшого ожидания (`time.sleep()` на 0.1 микросекунду), соответственно, при гигантских итерациях PyCustomRand будет немного уступать встроенному модулю `random` во времени.
71
+
* Некоторые функции библиотеки PyCustomRand (функции выборки, распределений) настолько просто написаны, что могут быть недостаточно оптимизированными для гигантских выборок (в добавок учитывается небольшое накапливающееся ожидание из-за проблемы выше).
72
72
73
73
## 📦 Установка
74
74
Установка библиотеки происходит через стандартный менеджер пакетов для Python:
Если у вас возникли проблемы с пакетным менеджером Python или прочие ошибки, то PyCustomRand можно установить другими способами:
82
+
82
83
<br>
83
84
84
85
* Скачивание пакета на официальной странице PyPI:
@@ -102,7 +103,7 @@ pip install pycustomrand
102
103
103
104
*`set_seed(seed=None)`
104
105
Устанавливает начальное состояние генератора.
105
-
*`seed`: Любой объект, который преобразуется в строку — число/строка/список и др. Если `None` — используется системное время (случайная последовательность).
106
+
*`seed`: Любой объект, который преобразуется в строку — число/строка/список и др. Если `None` — "посев" сбрасывается, и используется системное время (случайная последовательность).
106
107
107
108
*`_get_next_seed_state(current_seed)`
108
109
Внутренняя функция для обновления состояния сида (LCG алгоритм).
@@ -239,7 +240,7 @@ print(sample(array, k=2, counts=[1, 2, 3, 4])) # Список из k уника
Количество успехов в серии из `n` независимых испытаний с вероятностью успеха `p`.
242
-
Используется в моделировании финансов и математике. *Примеры*: Сколько раз сейчас выпадет орёл, если подбросить монету 10 раз — `binomialvariate(n=10, p=0.5)`.
243
+
Используется в математике и моделировании финансов. *Примеры*: Сколько раз сейчас выпадет орёл, если подбросить монету 10 раз — `binomialvariate(n=10, p=0.5)`.
### 1.2. Запуск конкретного теста в конкретном модуле
334
-
Если вы модифицируете библиотеку, и у вас постоянно не проходит проверку какой-то один конкретный тест, то вы можете не затрачивать время на запуск всех тестов — вам достаточно запустить один конкретный тест конкретного модуля, например:
335
+
Если вы модифицируете библиотеку, и у вас постоянно не проходит проверку какой-то один конкретный тест, то вы можете не тратить время на запуск всех тестов — вам достаточно запустить один конкретный тест конкретного модуля, например:
335
336
336
337
```python
337
338
from tests.test_round import TestTrueRound
@@ -379,7 +380,7 @@ if __name__ == "__main__":
379
380
PyCustomRand/ # Корень репозитория
380
381
├── .github/
381
382
│ └── workflows/
382
-
│ └── python-app.yml # Конфигурация GitHub Actions: автоматический запуск тестов при каждом Push/PR
383
+
│ └── python-app.yml # Конфигурация GH Actions: автоматический запуск тестов при каждом Push/PR
383
384
│
384
385
├── pycustomrand/ # Исходный код пакета
385
386
│ ├── __init__.py # Точка входа: инициализация пакета и алиасы функций
0 commit comments