5

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

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

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

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

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

我是否必须做一些事情才能得到这个结果,或者它是否旨在以这种方式工作?

4

2 回答 2

9

rand()and 也mt_rand()调用srand()andmt_srand()来产生随机的结果。但这里有一篇关于 php.net 的有趣帖子:

请注意,自动播种似乎是使用当前秒数完成的,这意味着您可以在快速服务器上多次运行获得相同的结果。要么使用更频繁更改的种子自己调用 srand(),要么使用似乎没有受到问题影响的 mt_rand()。

因此,只需srand更频繁地调用或mt_rand.

于 2012-06-26T09:00:27.333 回答
4

关于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 的新播种算法。相同的种子不再产生与以前版本相同的值序列。这种行为预计不会再次改变,但仍然认为依赖它是不安全的。

这是链接,描述了“ Mersenne Twister(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函数......

于 2012-06-26T09:03:15.280 回答