我有以下C - 程序:
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[]){
srand(time(NULL));
printf("%d", rand());
}
这个Python脚本:
import random
import time
random.seed(int(time.time()))
print (random.randint(0, 2147483647))
C程序中的RAND_MAX被定义为2147483647.如果我在同一秒内启动两个程序,它们应该打印相同的&#34;随机&#34;数字,但事实并非如此?
任何想法为什么?是否有不同的方法来获取伪随机数?种子绝对是一样的。
答案 0 :(得分:3)
C的随机数发生器根本没有标准化。 C11标准修订版在the footnote 295中注明
不能保证产生的随机序列的质量,并且已知一些实现产生具有令人沮丧的非随机低阶位的序列。 有特殊要求的应用程序应使用a 已知的发电机足以满足他们的需求。
Python是其中一个应用程序:Python选择使用MT19937-32随机数生成器,a.k.a。Mersenne Twister。 C库不太可能使用MT19937-32进行{{1}}实现,并使用相同的种子例程。
答案 1 :(得分:1)
他们唯一保证的是你会获得一个伪随机数。你基本上不能保证它是如何工作的。
即使您在两个不同的编译器上编译相同的C程序,在调用rand()
时也不能保证完全相同的结果。
你基本上想知道为什么你滚动两个不同的骰子时得不到相同的结果,即使你以完全相同的方式滚动它们。嗯,它们是不同的,结果也是如此。