我正在用 PHP 和 C 开发一个应用程序,但rand
两种语言的结果是不同的,即使我使用的是相同的种子:
PHP:
srand(1);
$random = rand(); // returns 32422
C:
srand(1);
int random = rand(); // returns 41
为什么会这样?
实现伪随机数生成器的方法不止一种。
每种编程语言都可以自由地指定自己的rand
实现,甚至什么都不指定。例如,C 规范只说“该rand
函数计算 0 到 0 范围内的伪随机整数序列RAND_MAX
”。没有提到rand
应该如何工作,所以编译器编写者可以随心所欲地实现rand
。
许多编译器使用线性同余生成器来实现rand
. 即使是这个简单的算法也有编译器可以自由指定的参数,这些参数会改变特定种子给出的数字序列。
看看 Borland 和 glibc 如何使用不同的参数。您甚至不能相信rand
在所有 C 程序中都能以相同的方式工作,更不用说所有程序了!