当我发现rand()
Linux上的重复次数似乎比Mac上重复的次数要多时,我正在C中实现一个哈希图,这是我正在研究的项目的一部分,并使用随机插入进行测试。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始终只生成一个,因此它遍历几乎可以重复生成的每个随机数。谁能告诉我这是如何工作的?我无法分辨出与手册页不同的东西,无法分辨每个正在使用的RNG,也无法在线找到任何东西。谢谢!