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
+68-2Lines changed: 68 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -23,7 +23,7 @@ PyCustomRand писался как альтернатива этим двум в
23
23
* Данная библиотека **проще** написана — весь код закомментирован, лёгок и понятен. В основе реализации генератора псевдослучайных чисел лежит *несложный* алгоритм (использующий системное время) поэтому библиотеку легко кастомизировать/расширять/дополнять под себя.
24
24
* В большинстве своём PyCustomRand выдаёт более *"энтропичный"* результат при нескольких генерациях подряд по сравнению со встроенным `random`-модулем.
25
25
* <details>
26
-
<summary>Сравнение с диаграммами</summary>
26
+
<summary>📊 Сравнение с диаграммами</summary>
27
27
28
28
PyCustomRand демонстрирует **на 173%** более высокую кучность распределения по сравнению со стандартной библиотекой `random` в тестах на **1,000,000** итераций.
29
29
@@ -54,7 +54,7 @@ PyCustomRand писался как альтернатива этим двум в
54
54
</details>
55
55
* Библиотека включает в себя все самые главные функции из [оригинальной](https://docs.python.org/3/library/random.html) Python-библиотеки, но только местами улучшенные и упрощённые (например: `random_integer` может выдавать сгенерированный результат, делимый на заданное число из диапазона; результат функции `random_float` можно округлять и пр.)
56
56
* <details>
57
-
<summary>Список функций</summary>
57
+
<summary>📑 Список функций</summary>
58
58
59
59
* Генерация целых чисел (`random_integer`, `randrange`, `gen_random_number`).
60
60
* Генерация вещественных чисел (`random`, `random_float`).
@@ -291,6 +291,7 @@ print(random_bool()) # Случайное значение True/False, н
291
291
292
292
</details>
293
293
294
+
294
295
### 🎯 О модуле `true_round`
295
296
Модуль решает проблему "банковского округления" в Python 3, где `round(x.5)` округляется до ближайшего чётного числа.
296
297
`true_round` использует **честное математическое округление** (отсюда и название "true" — истинное/честное).
@@ -306,6 +307,71 @@ print(random_bool()) # Случайное значение True/False, н
306
307
|**0.00049** (до 3-ёх знаков) | 0.0 |**0.001**| Точность при работе с малыми числами |
307
308
308
309
310
+
## 🧪 Тестирование и Диагностика
311
+
PyCustomRand предоставляет внутренние инструменты для проверки работоспособности библиотеки и качества энтропии генератора случайных чисел.
312
+
313
+
### 1. Запуск всех Unit-тестов
314
+
Чтобы убедиться, что все функции работают корректно и библиотека установлена правильно, запустите встроенные тесты, находясь в корне репозитория:
Отдельный запуск проверки модуля генератора случайных чисел:
322
+
323
+
```bash
324
+
python -m unittest tests/test_random.py
325
+
```
326
+
327
+
Отдельный запуск проверки модуля округления чисел:
328
+
329
+
```bash
330
+
python -m unittest tests/test_round.py
331
+
```
332
+
333
+
### 1.2. Запуск конкретного теста в конкретном модуле
334
+
Если вы модифицируете библиотеку, и у вас постоянно не проходит проверку какой-то один конкретный тест, то вы можете не затрачивать время на запуск всех тестов — вам достаточно запустить один конкретный тест конкретного модуля, например:
335
+
336
+
```python
337
+
from tests.test_round import TestTrueRound
338
+
import unittest
339
+
340
+
# Запуск теста "округления отрицательных чисел" для функции true_round
В библиотеку встроен декоратор `@check_distribution` (находится в `pycustomrand.diagnostics`). Он позволяет визуально оценить равномерность генерации чисел. Пример использования декоратора:
346
+
347
+
```python
348
+
from pycustomrand.diagnostics import check_distribution
349
+
import pycustomrand as pcr
350
+
351
+
# Декоратор запустит функцию 100.000 раз и разобьёт результаты на 20 корзин
352
+
@check_distribution(count=100_000, buckets=20)
353
+
defcheck_float_random():
354
+
return pcr.random()
355
+
356
+
if__name__=="__main__":
357
+
check_float_random()
358
+
```
359
+
360
+
Результат в консоли показывает:
361
+
* На какой сейчас итерации находится диагностика (каждые 5 секунд);
362
+
* Полное время выполнения генерации;
363
+
* Таблицу с количеством попаданий в каждую "корзину" (диапазон);
364
+
* Процентное отклонение от идеального распределения;
365
+
* Вердикт: "Отличное равномерное распределение" или предупреждение о перекосах.
366
+
367
+
<details>
368
+
<summary>📊 Пример результата диагностики</summary>
0 commit comments