Генераторы псевдослучайных чисел (PRNG) очень сложные звери.
Нет настоящих "совершенных" генераторов случайных чисел - на самом деле лучшее, что можно сделать из математических функций - это псевдослучайные - они кажутся достаточно случайными для большинства намерений и целей.
Фактически выполнение каких-либо дополнительных действий с числом, возвращаемым ГСЧ, на самом деле не увеличивает его случайность, и фактически число может стать менее случайным.
Итак, мой лучший совет: не балуйтесь со значениями, возвращаемыми из PRNG. Используйте PRNG, который достаточно хорош для предполагаемого использования, а если нет, то найдите PRNG, который может дать лучшие результаты, если это необходимо.
И, честно говоря, похоже, что функция mt_rand
использует Mersenne twister , который является довольно хорошим PRNG, так что, вероятно, он будет достаточно хорош для наиболее случайное использование.
Однако Mersenne Twister не предназначен для использования в каких-либо контекстах безопасности . См. этот ответ для решения, которое нужно использовать, когда вам нужна случайность для обеспечения безопасности.
Редактировать
В комментариях возник вопрос, почему выполнение операций со случайным числом может сделать его менее случайным. Например, некоторые PRNG могут возвращать более согласованные, менее случайные числа в разных частях битов - верхний конец может быть более случайным, чем младший.
Следовательно, в операциях, где верхний конец отбрасывается, а нижний возвращается, значение может стать менее случайным, чем исходное значение, возвращаемое из PRNG.
На данный момент я не могу найти хорошего объяснения, но я основал его на документации Java для метода Random.nextInt(int)
, который предназначен для создания довольно случайного значения в указанном диапазоне. Этот метод учитывает разницу в случайности частей значения, поэтому он может возвращать лучшее случайное число по сравнению с более наивными реализациями, такими как rand() % range
.