Воспроизводимые серии случайных чисел

Как я могу получить ряд воспроизводимых псевдослучайных чисел в PHP?

В старых версиях PHP я мог бы это сделать, просто используя одно и то же семя в RNG, но это не работа с тех пор, как PHP изменил способ работы rand и mt_rand.

Также см. этот комментарий на странице PHP.net:

Имейте в виду, что патч Suhosin, который установлен по умолчанию, многие PHP-установки, такие как Debian и DirectAdmin, полностью отключены функции srand и mt_srand для обеспечения безопасности шифрования. к генерировать воспроизводимые случайные числа из фиксированного семени на Сухосиновый сервер, вам нужно будет включить свой собственный псевдослучайный кода генератора.

ссылка этого комментария: http://www.php.net/manual/en/function.srand.php#102636

Готово ли решение? У меня нет времени и опыта создания собственного псевдослучайного кода генератора.

Моя цель - иметь код

<?php
   //( pseudo random code here...)
   $the_seed = 123; // 123 is just a number for demo purposes, NOT a static number
                    //...i hope you get the idea. It just a hardcoded seed,
                    // it could be a seed based on a user-id, a date etc...
                    // we need the same output for a given seed.
   //( pseudo random code here...)

   // ...and finally
   echo $the_random_number;
 ?>

поэтому каждый раз, когда я нахожу эту страницу, я должен получить тот же номер.

Ответ 1

The Mersenne Twist - это хороший быстрый PRNG, и для него реализована реализация PHP для него:

http://kingfisher.nfshost.com/sw/twister/

Это работает только на PHP 5.3.0 и выше.

Ответ 2

Одним из лучших алгоритмов случайных чисел по некоторым показателям является Mersenne Twister. Здесь вы можете найти чистую версию PHP (есть и другие).

Затем вы можете позвонить:

init_with_integer($integer_seed)

и каждый раз получать одинаковый результат (для данного семени).

Ответ 3

Это не лучший, но это один рабочий.

function ranseed($min, $max, $seed) {
    return round($min + (hexdec(md5($seed)) / hexdec("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")) * ($max - $min));
}