Eu estava implementando um hashmap em C como parte de um projeto no qual estou trabalhando e usando inserções aleatórias para testá-lo quando notei que rand()
no Linux parece repetir números com muito mais frequência do que no Mac. RAND_MAX
é 2147483647 / 0x7FFFFFFF nas duas plataformas. Eu o reduzi a este programa de teste que faz com que uma matriz de bytes seja RAND_MAX+1
longa, gere RAND_MAX
números aleatórios, anote se cada uma é uma duplicata e verifique a lista como visto.
#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);
}
O Linux gera consistentemente cerca de 790 milhões de duplicatas. O Mac sempre gera apenas um, de modo que percorre todos os números aleatórios que pode gerar quase sem repetir. Alguém pode me explicar como isso funciona? Não sei dizer nada diferente das páginas de manual, não sei qual RNG está usando e não consigo encontrar nada online. Obrigado!