是RAND()时间依赖性在PHP?(Is rand() time-dependent in php?

2019-06-25 18:49发布

让我们解释一下我的意思。

前一段时间,而写在C#程序,我做了以下错误:

int Randomize()
{
    Random r=new Random();
    return  r.Next(0,10);
}

在C#中,这是一个错误,因为,在连续多次调用,这个函数将返回相同的值。 这是因为随机构造函数使用时间的种子,并要求之间的时间差太低(我花了一小时才找到一个:))。

现在,我使用rand(...)在PHP,我需要的输出永远是不同的,即使2个脚本在同一时间执行。

我必须做一些事情来得到这样的结果,抑或是设计这样的工作方式?

Answer 1:

rand()mt_rand()调用srand()mt_srand()产生总是随机的结果。 但这里的上php.net一个有趣的帖子:

需要注意的是自动播种似乎与当前的秒数,这意味着你可以得到一个快速的服务器上运行的几个相同的结果完成。 要么调用srand()函数自己一个更经常变化的种子或使用mt_rand(),它不会出现在问题的困扰。

所以,只需要调用srand更频繁或mt_rand



Answer 2:

关于mt_rand()函数...

从http://php.net/manual/en/function.mt-srand.php

自PHP 4.2.0起,就没有必要用srand随机数发生器()或mt_srand(),因为这是现在自动完成。

(对于PHP 5.2.1)在PHP梅森倍捻机实现现在使用由理查德·瓦格纳新种植​​算法。 相同的种子不再产生他们在以前版本的值相同的序列。 但预计该行为再次发生变化,但它被认为是不安全的仍然依靠它。

这里是链接 ,与所述的描述“ 梅森倍捻机(MT)”伪随机数生成算法(以及实现在C,C ++,C#)

在这里你可以找到实施PHP这个功能的5

而在php_rand.h我发现这一点:

#ifdef PHP_WIN32
#define GENERATE_SEED() (((long) (time(0) * GetCurrentProcessId())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
#else
#define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))
#endif

所以,现在你可以看到,在PHP随机函数依赖于time函数...



文章来源: Is rand() time-dependent in php?
标签: php random