J'implémentais une table de hachage en C dans le cadre d'un projet sur lequel je travaille et j'utilise des insertions aléatoires pour le tester lorsque j'ai remarqué que rand()
sous Linux, il semble répéter les nombres beaucoup plus souvent que sur Mac. RAND_MAX
est 2147483647 / 0x7FFFFFFF sur les deux plates-formes. Je l'ai réduit à ce programme de test qui fait un tableau d'octets de RAND_MAX+1
long, génère RAND_MAX
des nombres aléatoires, note si chacun est un doublon et le vérifie dans la liste comme on le voit.
#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 génère régulièrement environ 790 millions de doublons. Mac n'en génère systématiquement qu'un, de sorte qu'il parcourt chaque nombre aléatoire qu'il peut générer presque sans répétition. Quelqu'un peut-il m'expliquer comment cela fonctionne? Je ne peux rien dire de différent des pages de manuel, je ne peux pas dire quel RNG chacun utilise et je ne trouve rien en ligne. Merci!