Ich habe eine Hashmap in C als Teil eines Projekts implementiert, an dem ich arbeite, und zufällige Einfügungen verwendet, um sie zu testen, als ich bemerkte, dass rand()
unter Linux Zahlen weitaus häufiger wiederholt werden als auf Mac. RAND_MAX
ist 2147483647 / 0x7FFFFFFF auf beiden Plattformen. Ich habe es auf dieses Testprogramm reduziert, das ein Byte-Array RAND_MAX+1
-lang macht, RAND_MAX
Zufallszahlen generiert , notiert, ob jedes ein Duplikat ist, und es wie gesehen von der Liste abhakt.
#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 generiert konsistent rund 790 Millionen Duplikate. Der Mac generiert konsistent nur eine, sodass er jede Zufallszahl durchläuft, die er fast ohne Wiederholung generieren kann . Kann mir bitte jemand erklären, wie das funktioniert? Ich kann nichts anderes als die Manpages sagen, kann nicht sagen, welches RNG jeder verwendet, und kann online nichts finden. Vielen Dank!