Stavo implementando un hashmap in C come parte di un progetto a cui sto lavorando e usando inserimenti casuali per testarlo quando ho notato che rand()
su Linux sembra ripetere numeri molto più spesso che su Mac. RAND_MAX
è 2147483647 / 0x7FFFFFFF su entrambe le piattaforme. L'ho ridotto a questo programma di test che rende un array di byte RAND_MAX+1
lungo, genera RAND_MAX
numeri casuali, note se ciascuno è un duplicato e lo controlla dall'elenco come 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);
}
Linux genera costantemente circa 790 milioni di duplicati. Il Mac genera costantemente solo uno, quindi scorre attraverso ogni numero casuale che può generare quasi senza ripetere. Qualcuno può spiegarmi come funziona? Non posso dire nulla di diverso dalle pagine man, non posso dire quale RNG sta usando ciascuno e non riesco a trovare nulla online. Grazie!