#php #random
#php #Случайный
Вопрос:
Как я могу получить ряд воспроизводимых псевдослучайных чисел в PHP?
В более старых версиях PHP я мог бы сделать это, просто используя то же самое начальное значение в RNG, но это больше не работает, поскольку PHP изменил способ работы rand и mt_rand.
Пожалуйста, также посмотрите этот комментарий в PHP.net страница:
Имейте в виду, что исправление Suhosin, которое установлено по умолчанию во многих PHP-установках, таких как Debian и DirectAdmin, полностью отключает функции srand и mt_srand по соображениям безопасности шифрования. Чтобы генерировать воспроизводимые случайные числа из фиксированного начального числа на сервере с поддержкой Suhosin, вам нужно будет включить свой собственный код генератора псевдослучайных чисел.
ссылка на этот комментарий: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's 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_random_number
до 9.2. Вы сказали ‘каждый раз, когда я захожу на эту страницу, я должен получать одно и то же число’. Чем это отличается от static?
3. Ваше определение случайности нарушено
4. @PaulCroarkin Разница в том, что ему не придется хранить сотни, тысячи или миллионы фрагментов — они могут быть сгенерированы на лету. Его не интересует только первое число, возвращаемое из prng, он заинтересован в том, чтобы иметь много чисел без необходимости их сохранения.
5. Вместо этого @CanSpice должен был ссылаться на полосу xkcd .
Ответ №1:
Mersenne Twist — это хороший быстрый PRNG, и вот общедоступная реализация PHP для него:
http://kingfisher.nfshost.com/sw/twister/
Это работает только на PHP 5.3.0 и выше.
Комментарии:
1. Спасибо, сэр, я собираюсь попробовать это прямо сейчас … я приму ответ, как только смогу 🙂
2. Также хотелось бы добавить эту реализацию для PHP < 5.3.0 boxrefuge.com/?p=18 (только что нашел и протестировал, что это работает как шарм — также интересная статья о производительности, ознакомьтесь с ней)
3. Почему бы не использовать встроенные в PHP случайные функции?
4. @McKay Второй абзац вопроса отвечает на ваш вопрос. Короче говоря, ему нужна одна и та же последовательность случайных чисел для данного ввода — обычно это достигается путем заполнения генератора случайных чисел одним и тем же начальным значением каждый раз. Однако распространенное исправление безопасности для PHP удаляет возможность инициализации генератора случайных чисел, потому что слишком много людей использовали его для приложений криптографии, но не использовали криптографически безопасный исходный источник.
5. the boxrefuge.com внедрение неверно (не дает тех же результатов, что и ссылочное внедрение)
Ответ №2:
Одним из лучших алгоритмов случайных чисел по некоторым показателям является Mersenne Twister. Вы можете найти чистую версию PHP здесь (есть и другие).
Затем вы можете вызвать:
init_with_integer($integer_seed)
и получать один и тот же результат (для заданного начального значения) каждый раз.
Ответ №3:
Если вам не нужен высококачественный вывод, Lehmer RNG настолько прост, насколько это возможно. Это был один из алгоритмов, которые могли быть использованы srand()
внутри (в зависимости от вашей операционной системы).
$seed = 42; // any integer, maybe a database id
// init Lehmer RNG
$seed = $seed % 2147483647;
if ($seed <= 0) $seed = 2147483646;
// generate as many random numbers as you need
$seed = $seed * 48271 % 2147483647;
print($seed);
$seed = $seed * 48271 % 2147483647;
print($seed);
$seed = $seed * 48271 % 2147483647;
print($seed);
$seed = $seed * 48271 % 2147483647;
print($seed);
...
Вы можете ограничить вывод диапазоном с:
$min = 0;
$max = 9;
print($min ($seed % $max));
Ответ №4:
Это не лучший вариант, но он рабочий
function ranseed($min, $max, $seed) {
return round($min (hexdec(md5($seed)) / hexdec("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")) * ($max - $min));
}