Я реалізовував хешмап в C в рамках проекту, над яким я працюю, і використовую випадкові вставки для тестування, коли я помітив, що rand()
в Linux, схоже, повторюються цифри набагато частіше, ніж на Mac. RAND_MAX
є 2147483647 / 0x7FFFFFFF на обох платформах. Я скоротив її до цієї тестової програми, яка робить байтовий масив RAND_MAX+1
-long, генерує RAND_MAX
випадкові числа, відзначає, якщо кожен є дублікатом, і перевіряє його зі списку, як показано.
#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 послідовно генерує близько 790 мільйонів дублікатів. Mac послідовно генерує лише одне, тож воно перебирає кожне випадкове число, яке може генерувати майже не повторюючись. Чи може хто-небудь пояснити мені, як це працює? Я не можу розповісти нічого, що відрізняється від чоловічих сторінок, не можу сказати, який RNG використовує кожен, і не можу знайти нічого в Інтернеті. Дякую!