Действительно ли функция PHP rand так плохо?
Я знаю, что рекомендуется использовать mt_rand()
поверх rand()
, потому что он использует Mersenne Twister над любым PRNG rand()
, но здесь что-то, что никогда не кажется факторизованным в: активности пользователя.
Фактически, действия пользователей можно считать довольно случайными. Например, в любой момент может возникнуть 4% -ый шанс, что пользователь может вызвать вызов rand()
для одной функции, 8% -ный шанс для пользователя, вызывающего три вызова rand()
, и shuffle()
, 20% пользователя, вызывающего два вызова rand()
, и каждый раз, когда пользователь загружает страницу, PRNG продвигается на один.
В конце концов, это не движение NPC, что делает RNG-злоупотребление в играх Pokémon настолько расстраивающим?
Итак, имея в виду, что, хотя rand()
имеет свои шаблоны, случайность действий пользователей и разнообразие использования rand()
достаточно, чтобы сделать недостатки rand()
несущественными? В абсолютном выражении mt_rand()
является "более случайным". Но как это соотносится с энтропией человеческого элемента?
Ответы
Ответ 1
Если вы предполагаете, что вызовы rand() генерируются человеческими пользователями в случайные моменты, тогда я предполагаю, что ваша логика верна.
Однако представьте себе бота, который отправляет одни и те же запросы каждые X секунд (в ночные часы, не прерываемые человеческими вызовами) или простой script, который запускается на заданное количество времени и запускает rand() один за другим. Тогда вы не можете полностью зависеть от случайности.
комментарий от php.net:
Обратите внимание, что автоматическое сеяние, по-видимому, выполняется с помощью текущего количество секунд, что означает, что вы можете получить одинаковые результаты для нескольких работает на быстром сервере. Вызовите srand() самостоятельно с помощью часто меняя семя или используйте mt_rand(), который не появляется страдают от проблемы.
Ответ 2
Но как это соотносится с энтропией человеческого элемента?
Я предполагаю этот сценарий:
- Игра с несколькими тысячами пользователей.
- По какой-то причине, каждые X минут, вы должны установить случайное значение для каждого пользователя (каждый раз с одинаковым порядком)
Из-за псевдослучайной функции более вероятно с пользователем XXX, и пользователь YYY всегда имеет одинаковое расстояние. Поскольку одна из проблем псевдослучайности заключается в том, что область может быть "более" предсказуемой после достаточного количества циклов.