在rand()时间依赖于PHP吗?

时间:2012-06-26 08:49:46

标签: php random

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

前段时间,在用c#编写程序时,我犯了以下错误:

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

在c#中,这是一个错误,因为,连续多次调用此函数将返回相同的值。这是因为Random构造函数使用时间种子,并且调用之间的时间差太小(花了我一个小时来找到那个:))。

现在我在php中使用rand(...),我需要输出始终不同,即使同时执行了2个脚本。

我是否必须采取措施才能获得此结果,还是设计为以这种方式工作?

2 个答案:

答案 0 :(得分:9)

rand()以及mt_rand()来电srand()mt_srand()以产生随机结果。 但这是php.net上的一篇有趣帖子:

  

请注意,自动播种似乎是用电流完成的   秒数表示您可以获得相同的结果   在快速服务器上运行。要么自己调用srand()更多   经常更换种子或使用看似不合适的mt_rand()   遇到了这个问题。

因此,只需更频繁地致电srandmt_rand

答案 1 :(得分:3)

关于mt_rand()功能......

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

  

从PHP 4.2.0开始,不需要使用srand()或mt_srand()为随机数生成器播种,因为现在这是自动完成的。

     

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

以下是link,其中描述了“ Mersenne Twister(MT)”伪随机数生成算法(以及C,C ++,C#中的implementations

Here你可以在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函数...