Модуль секретов Python ведет себя предсказуемо

Я посмотрел между случайным и секретным и обнаружил, что секреты «криптографически безопасны». Каждый источник переполнения стека говорит, что это наиболее близко к истинному случайному. Поэтому я подумал использовать его для создания популяции. Однако это дало вовсе не случайные результаты, а скорее предсказуемые результаты.

Первой характеристикой, которую я проверил, был пол, а точнее 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, которые производят энтропийные или хаотические числа?

Должен ли модуль секретов действовать предсказуемым образом?

Шанс получить 100% одной вещи почти равен нулю ... каждое случайное событие составляет 1/4, если вы предоставите 4 предмета. Ваш вопрос не имеет смысла - просто проверьте это на несколько тысяч лет, и вы можете получить 100% - результат одного элемента...

Patrick Artner 10.04.2019 21:33

Значит, вы не предполагали, что ваши результаты будут предсказуемы… разве это не делает их непредсказуемыми?

Ctrl S 10.04.2019 21:38

Плоское распределение случайных чисел — это предполагаемый, чтобы быть «предсказуемым» таким образом — если каждый элемент равновероятен, вы ожидаете примерно одинаковое их количество. Если вы неоднократно бросаете миллиард костей, как часто вы ожидаете увидеть все единицы?

Blorgbeard 10.04.2019 21:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
124
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что вы можете смешивать здесь несколько разных идей.

Функция secrets.choice будет случайным образом выбирать 1 из 4 вариантов пола, которые вы предоставили, каждый раз, когда она вызывается, что в вашем примере составляет 2000000000 раз. Вероятность получения 100% любого варианта после случайного выбора из списка 4-х вариантов 2000000000 раз практически равна нулю в любом разумно реализованном генераторе случайностей.

Если я правильно понимаю ваш вопрос, это на самом деле довольно убедительное доказательство того, что функция secrets.choice ведет себя так, как ожидалось, и обеспечивает равномерное распределение предоставленных ей параметров. Дисперсия должна упасть до нуля, когда ваш N приближается к бесконечности.

Другие вопросы по теме