我正在使用以下代码生成一系列伪随机数:
$seed = 1;
srand( $seed );
for($i=0; $i<10; $i++)
{
echo rand(0,100) . "\n";
}
exit(0);
以下代码始终输出(在我的机器上)
84
39
79
[....]
77
28
55
我可以依靠上述代码的输出总是相同的事实吗?
如果没有,什么可以改变它?
例如,不同版本的 PHP 可能会给出不同的结果吗?
还是 PHP 在不同的操作系统上运行?
我正在使用以下代码生成一系列伪随机数:
$seed = 1;
srand( $seed );
for($i=0; $i<10; $i++)
{
echo rand(0,100) . "\n";
}
exit(0);
以下代码始终输出(在我的机器上)
84
39
79
[....]
77
28
55
我可以依靠上述代码的输出总是相同的事实吗?
如果没有,什么可以改变它?
例如,不同版本的 PHP 可能会给出不同的结果吗?
还是 PHP 在不同的操作系统上运行?
如果我在 Windows 上运行此代码,我会得到 99、38、79、21、75、91、42、36、47、67 的序列。它与我的 Windows 机器上的所有 32 位或 64 位版本一致.
而如果我在 Linux 机器上运行它,无论 PHP 的哪个版本,我始终会得到 84、39、79、80、92、19、33、77、28、55 的序列
所以操作系统之间不一致
但是,如果我使用mt_srand()
andmt_rand()
而不是srand()
andrand()
然后我确实在 Windows/Linux 和从 5.2 到 7.0 的不同版本的 PHP 之间获得一致性
$seed = 1;
mt_srand( $seed );
for($i=0; $i<10; $i++)
{
echo mt_rand(0,100) . "\n";
}
exit(0);
始终给出 58, 0, 72, 94, 100, 87, 70, 100, 86, 76
不保证随机数在操作系统或 PHP 版本之间是相同的。所以最好的办法是创建你自己的伪随机数生成器,正如这篇博文中所指出的那样
这是代码:
<?php
class Random {
// random seed
private static $RSeed = 0;
// set seed
public static function seed($s = 0) {
self::$RSeed = abs(intval($s)) % 9999999 + 1;
self::num();
}
// generate random number
public static function num($min = 0, $max = 9999999) {
if (self::$RSeed == 0) self::seed(mt_rand());
self::$RSeed = (self::$RSeed * 125) % 2796203;
return self::$RSeed % ($max - $min + 1) + $min;
}
}
// set seed
Random::seed(42);
// echo 10 numbers between 1 and 100
for ($i = 0; $i < 10; $i++) {
echo Random::num(1, 100) . ',';
}
echo "\n";
for ($i = 0; $i < 10; $i++) {
echo Random::num() . ',';
}
echo "\n";
结果是:
76,86,14,79,73,2,87,43,62,7,
393758,1684299,822150,2105442,337168,202955,203548,277673,1154689,1729772,
显然,您将在不同的 PHP 版本之间获得一致的结果。请注意,您必须提供种子,否则此功能将重新启用mt_rand
,然后您将再次受到操作系统的摆布!