rand()
Linux에서 Mac보다 숫자가 훨씬 자주 반복되는 것으로 보았을 때 작업중 인 프로젝트의 일부로 C에서 해시 맵을 구현하고 무작위 삽입을 사용하여 테스트했습니다 . 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은 일관되게 하나만 생성하므로 거의 반복하지 않고 생성 할 수있는 모든 난수 를 반복합니다. 누구든지 이것이 어떻게 작동하는지 설명해 주시겠습니까? 매뉴얼 페이지와 다른 것을 말할 수 없으며, 각각의 RNG를 사용하고 있는지, 온라인에서 찾을 수없는 것을 알 수 없습니다. 감사!