我正在用 C 语言实现一个散列表,这是我正在做的一个项目的一部分,我使用随机插入来测试它。我注意到,与 Mac 相比,Linux 上的 rand()
似乎更经常地重复数字。两个平台上的 RAND_MAX
都是 2147483647/0x7FFFFFFF
。我已经把它简化为这个测试程序,使字节数组 RAND_MAX+1
-long,生成 RAND_MAX
随机数,注意是否每个都是重复的,并检查它从列表中看到的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main() {
size_t size = ((size_t)RAND_MAX) + 1;
char *randoms = calloc(size, sizeof(char));
int dups = 0;
srand(time(0));
for (int i = 0; i < RAND_MAX; i++) {
int r = rand();
if (randoms[r]) {
// printf("duplicate at %d\n", r);
dups++;
}
randoms[r] = 1;
}
printf("duplicates: %d\n", dups);
}
Linux 一直生成大约7.9亿个副本。Mac 始终只生成一个,所以它循环遍历每个随机数,它可以不重复地生成 差不多。有人能给我解释一下这是怎么回事吗?我不能告诉任何不同的 man
页面,不能告诉每个 RNG 使用,也不能在网上找到任何东西。谢谢!