Я реализовывал хэш-карту в C как часть проекта, над которым я работаю, и использовал случайные вставки для его проверки, когда заметил, что rand()
в Linux кажется, что цифры повторяются гораздо чаще, чем в Mac. RAND_MAX
равно 2147483647 / 0x7FFFFFFF на обеих платформах. Я сократил его до этой тестовой программы, которая создает массив байтов RAND_MAX+1
длиной, генерирует 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 последовательно генерирует только одно, поэтому он просматривает каждое случайное число, которое может генерировать почти без повторения. Может кто-нибудь объяснить мне, как это работает? Я не могу сказать ничего отличного от man-страниц, не могу сказать, какой RNG использует каждый, и не могу найти что-либо в Интернете. Спасибо!