Pseudorandom number generators (ПСЧ) очень сложный зверь.
Нет никаких реальных «идеальных» генераторов случайных чисел - на самом деле лучшее, что можно сделать с помощью математических функций, является псевдослучайным - они кажутся случайными для большинства целей и целей.
Фактически, выполнение каких-либо дополнительных действий из числа, возвращаемого PRNG, на самом деле не увеличивает его случайность, и фактически число может стать менее случайным.
Итак, мой лучший совет: не вмешивайтесь со значениями, возвращаемыми с PRNG. Используйте PRNG, который достаточно хорош для предполагаемого использования, а если нет, то найдите PRNG, который может принести лучшие результаты, если это необходимо.
И, откровенно говоря, выясняется, что функция mt_rand
использует Mersenne twister, что является довольно хорошим PRNG, так как это, вероятно, будет достаточно хорошим для большинства случайных целей.
Mersenne Twister не предназначен для использования в каких-либо контекстах безопасности.. См. this answer для решения, которое необходимо использовать, когда вам нужна случайность, чтобы обеспечить безопасность.
Редактировать
Был вопрос в комментариях, почему выполнение операций случайного числа может сделать его менее случайным образом. Например, некоторые PRNG могут возвращать более последовательные, менее случайные числа в разных частях бит - high-end может быть более случайным, чем младший.
Поэтому в операциях, в которых элитный класс отбрасывается, а нижний конец возвращается, значение может стать менее случайным, чем исходное значение, возвращаемое из PRNG.
В настоящее время я не могу найти хорошее объяснение, но я основывался на документации Java для метода Random.nextInt(int)
, который предназначен для создания довольно случайного значения в указанном диапазоне. Этот метод учитывает разницу в случайности частей значения, поэтому он может возвращать лучшее случайное число по сравнению с более наивными реализациями, такими как rand() % range
.
Это дубликат одного из моих вопросов http://stackoverflow.com/questions/5611/better-random-generating-php – UnkwnTech
В последней версии php есть [криптографически безопасный PRNG] (http: // stackoverflow. ком/а/31443898/1090562). –
Если кто-то читает это, пропустите принятый ответ, потому что [этот ответ правильный] (http://stackoverflow.com/a/31443898/2224584). Если вы застряли на PHP 5, проверьте [random_compat] (https://github.com/paragonie/random_compat). –