Wdrażałem hashap w C jako część projektu, nad którym pracuję i używam losowych wstawek do testowania go, gdy zauważyłem, że rand()
w Linuksie wydaje się powtarzać liczby znacznie częściej niż na Macu. RAND_MAX
to 2147483647 / 0x7FFFFFFF na obu platformach. Sprowadziłem go do tego programu testowego, który tworzy tablicę bajtów RAND_MAX+1
-długą, generuje RAND_MAX
liczby losowe, zauważa, czy każdy z nich jest duplikatem, i sprawdza go z listy, jak widać.
#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 konsekwentnie generuje około 790 milionów duplikatów. Mac konsekwentnie generuje tylko jeden, więc zapętla każdą losową liczbę, którą może wygenerować prawie bez powtarzania. Czy ktoś może mi wyjaśnić, jak to działa? Nie mogę powiedzieć nic innego niż strony podręcznika, nie mogę powiedzieć, którego RNG używa i nie mogę znaleźć niczego online. Dzięki!