Действительно ли функция 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 всегда имеет одинаковое расстояние. Поскольку одна из проблем псевдослучайности заключается в том, что область может быть "более" предсказуемой после достаточного количества циклов.