Я посмотрел между случайным и секретным и обнаружил, что секреты «криптографически безопасны». Каждый источник переполнения стека говорит, что это наиболее близко к истинному случайному. Поэтому я подумал использовать его для создания популяции. Однако это дало вовсе не случайные результаты, а скорее предсказуемые результаты.
Первой характеристикой, которую я проверил, был пол, а точнее 4, и все это нанес на карту...
# code may not function as it's typed on mobile without a computer to test on
import secrets
import multiprocessing
def gen(args*):
gender = ["Male", "Female", "X", "XXY"]
rng = secrets.choice(gender)
return rng
with multiprocessing.Pool(processes=4) as pool:
id_ = [I for I in range (2000000000)]
Out = pool.map(gen, id_)
# Do stuff with the data
Когда я обрабатываю данные с помощью других функций, которые определяют процентное отношение одного пола к другому, оно всегда составляет 25 +- 1%. Я ожидал, что иногда будут 100% 1 пола и 0 других, но этого не произошло.
Я также пробовал то же самое со случайным, это дало аналогичные результаты, но почему-то заняло вдвое больше времени.
Я также изменил пол списка, чтобы иметь один из X и XXY, имея 49 из двух других, и это дало предсказуемый результат 1% X и 1% XXY.
У меня нет большого опыта работы с ГСЧ на компьютерах, если не считать термина энтропия... Есть ли в Python какие-либо нативные пакеты или пакеты PYPI, которые производят энтропийные или хаотические числа?
Должен ли модуль секретов действовать предсказуемым образом?
Значит, вы не предполагали, что ваши результаты будут предсказуемы… разве это не делает их непредсказуемыми?
Плоское распределение случайных чисел — это предполагаемый, чтобы быть «предсказуемым» таким образом — если каждый элемент равновероятен, вы ожидаете примерно одинаковое их количество. Если вы неоднократно бросаете миллиард костей, как часто вы ожидаете увидеть все единицы?
Я думаю, что вы можете смешивать здесь несколько разных идей.
Функция secrets.choice
будет случайным образом выбирать 1 из 4 вариантов пола, которые вы предоставили, каждый раз, когда она вызывается, что в вашем примере составляет 2000000000 раз. Вероятность получения 100% любого варианта после случайного выбора из списка 4-х вариантов 2000000000 раз практически равна нулю в любом разумно реализованном генераторе случайностей.
Если я правильно понимаю ваш вопрос, это на самом деле довольно убедительное доказательство того, что функция secrets.choice
ведет себя так, как ожидалось, и обеспечивает равномерное распределение предоставленных ей параметров. Дисперсия должна упасть до нуля, когда ваш N приближается к бесконечности.
Шанс получить 100% одной вещи почти равен нулю ... каждое случайное событие составляет 1/4, если вы предоставите 4 предмета. Ваш вопрос не имеет смысла - просто проверьте это на несколько тысяч лет, и вы можете получить 100% - результат одного элемента...