Estaba implementando un hashmap en C como parte de un proyecto en el que estoy trabajando y usando inserciones aleatorias para probarlo cuando noté que rand()
en Linux parece repetir números con mucha más frecuencia que en Mac. RAND_MAX
es 2147483647 / 0x7FFFFFFF en ambas plataformas. Lo reduje a este programa de prueba que crea una matriz de bytes de RAND_MAX+1
largo, genera RAND_MAX
números aleatorios, anota si cada uno es un duplicado y lo elimina de la lista como se ve.
#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 genera constantemente alrededor de 790 millones de duplicados. Mac consistentemente solo genera uno, por lo que recorre cada número aleatorio que puede generar casi sin repetir. ¿Alguien puede explicarme cómo funciona esto? No puedo decir nada diferente de las páginas del manual, no puedo decir qué RNG está usando cada una, y no puedo encontrar nada en línea. ¡Gracias!