4

我正在使用以下代码生成一系列伪随机数:

$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 在不同的操作系统上运行?

4

2 回答 2

3

如果我在 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

于 2015-12-05T15:09:35.660 回答
2

不保证随机数在操作系统或 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,然后您将再次受到操作系统的摆布!

于 2019-11-17T00:22:58.857 回答