2

PHP 5.2 或 5.4 上的此代码产生可预测的顺序,但在 PHP 5.3srand(seed)上被忽略。

$n = date('YmdHi');
$a = explode('|','uno|due|tre|quattro|cinque');
printf("%s\n",$n);
print_r($a);
srand($n);
shuffle($a);
print_r($a);

更紧凑的代码(我希望在同一分钟有相同的数字,但在 PHP 5.3 上它不起作用):

$n = date('YmdHi');
srand($n);
printf("%s\n",rand(1,100));

你可以在这里尝试不同版本的 PHP http://sandbox.onlinephpfunctions.com/code/fromFunction/srand

更新

@likeitlikeit 根据文档,如果您srand()在之前设置种子(带有)rand()rand()则函数应该为每次运行返回相同的输出。当您想要基于任意整数(在我的情况下为日期)的可预测“rand”输出时,这很有用。

这段代码应该为每个$tin产生相同的输出foreach,但这似乎不适用于所有 PHP 版本。PHP 5.3 和 5.1(我今天发现)返回不同的输出 foreach $t,就像srand()未设置一样。

foreach(range(1,10) as $t){
    srand('20130605'); printf("| %s ",rand(1,100));
}

PHP 5.4.x

| 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40

PHP 5.3.x

| 61 | 30 | 68 | 16 | 97 | 24 | 5 | 36 | 90 | 24

PHP 5.2.x

| 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40

PHP 5.1.x

| 8 | 96 | 15 | 7 | 25 | 17 | 4 | 70 | 46 | 99

PHP 5.0.x

| 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40

4

1 回答 1

0

如果您使用常数值播种随机数生成器(如 rand),则输出rand() 可能是可预测的。根据实现,输出可能

| 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40

如果您反复使用相同的值重新播种生成器,然后每次都要求它生成具有相同参数的随机数,则输出可能是完全可重复的 - 但您不应该依赖这种行为。

如果您不使用srand()任何参数,它会专门生成一个随机数来作为生成器的种子。这可以确保每次运行时rand(1,100);,生成器都从随机种子状态开始,并将生成随机输出。

如果您不知道为什么要播种随机数生成器,那么您可能不需要。

在 PHP 网站上它是这样说的:

[来自版本] 5.2.1 PHP 中的 Mersenne Twister 实现现在使用 Richard Wagner 的新播种算法。相同的种子不再产生与以前版本相同的值序列。这种行为预计不会再次改变,但仍然认为依赖它是不安全的。

因此,依靠随机数生成器产生相同的输出是不安全的——如果您需要依靠不同的输出,请使用不同的方法。srand()显然应该是随机数生成器,而不是伪随机数生成器。不保证确定性。

于 2014-09-24T16:44:22.543 回答