我有以下 C - 程序:
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[]){
srand(time(NULL));
printf("%d", rand());
}
Run Code Online (Sandbox Code Playgroud)
这个 Python 脚本:
import random
import time
random.seed(int(time.time()))
print (random.randint(0, 2147483647))
Run Code Online (Sandbox Code Playgroud)
C 程序中的 RAND_MAX 定义为 2147483647。如果我在同一秒启动两个程序,它们应该打印相同的“随机”数,但事实并非如此?
任何想法为什么?是否实现了不同的方法来获取伪随机数?种子肯定是一样的。
C 的随机数生成器根本没有标准化。C11 标准修订版在脚注 295 中指出
无法保证所产生的随机序列的质量,并且已知某些实现会产生具有令人不安的非随机低阶位的序列。具有特殊要求的应用程序应使用已知足以满足其需求的发生器。
Python 就是这些应用程序之一:Python 选择使用MT19937-32随机数生成器,又名 Mersenne Twister。C 库不太可能使用 MT19937-32 进行rand实现,并使用相同的种子程序。