让我们解释一下我的意思。
前段时间,在用c#编写程序时,我犯了以下错误:
int Randomize()
{
Random r=new Random();
return r.Next(0,10);
}
在c#中,这是一个错误,因为,连续多次调用此函数将返回相同的值。这是因为Random构造函数使用时间种子,并且调用之间的时间差太小(花了我一个小时来找到那个:))。
现在我在php中使用rand(...)
,我需要输出始终不同,即使同时执行了2个脚本。
我是否必须采取措施才能获得此结果,还是设计为以这种方式工作?
答案 0 :(得分:9)
rand()
以及mt_rand()
来电srand()
和mt_srand()
以产生随机结果。
但这是php.net上的一篇有趣帖子:
请注意,自动播种似乎是用电流完成的 秒数表示您可以获得相同的结果 在快速服务器上运行。要么自己调用srand()更多 经常更换种子或使用看似不合适的mt_rand() 遇到了这个问题。
因此,只需更频繁地致电srand
或mt_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
函数...