rand()种子以同样的方式产生不同的结果

时间:2013-01-28 20:06:13

标签: php c++ c random srand

我正在用PHP和C开发一个应用程序但是rand的结果在两种语言之间是不同的,即使我使用相同的种子:

PHP:

srand(1);
$random = rand(); // returns 32422

C:

srand(1);
int random = rand(); // returns 41

为什么会这样?

1 个答案:

答案 0 :(得分:3)

实现伪随机数生成器的方法不止一种。

每种编程语言都可以自由指定自己的rand实现,甚至不指定任何内容。例如,C规范只说“rand函数计算0到RAND_MAX范围内的伪随机整数序列。”没有提到rand应该如何工作,所以编译器编写者可以实现rand但是他们喜欢。

许多编译器使用linear congruential generator来实现rand。即使这个简单的算法也有编译器可以自由指定的参数,它们会改变特定种子给出的数字序列。

LCG parameters

看看Borland和glibc如何使用不同的参数。您甚至不能相信rand在所有C程序中都可以这样做,更不用说所有程序了!