如何在PHP中获得一系列可重现的伪随机数?
在旧版本的PHP中,我可以通过在RNG中使用相同的种子来实现,但它不再起作用,因为PHP已经改变了rand和mt_rand的工作方式。
请在PHP.net页面中看到此评论:
请记住默认情况下安装的Suhosin补丁 许多PHP安装,如Debian和DirectAdmin完全禁用 srand和mt_srand函数用于加密安全性原因。至 从a上的固定种子生成可重现的随机数 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;
?>
因此,每当我访问此页面时,我都会得到相同的号码。
答案 0 :(得分:10)
Mersenne Twist是一个很好的快速PRNG,这是一个公共域PHP实现:
http://kingfisher.nfshost.com/sw/twister/
仅适用于PHP 5.3.0及更高版本。
答案 1 :(得分:7)
一些指标中最好的随机数算法之一是Mersenne Twister。 您可以找到纯PHP版本here(还有其他版本)。
然后你可以打电话:
init_with_integer($integer_seed)
每次都获得相同的输出(对于给定的种子)。
答案 2 :(得分:1)
如果您不需要高质量的输出,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));
答案 3 :(得分:-1)
这不是最好的,但它是一个工作
function ranseed($min, $max, $seed) {
return round($min + (hexdec(md5($seed)) / hexdec("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")) * ($max - $min));
}