私が取り組んでいるプロジェクトの一部として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は常に約7億9千万の複製を生成します。Macは常に1つしか生成しないため、ほとんど繰り返すことなく生成できるすべての乱数をループします。誰も私にこれがどのように機能するか説明してくれませんか?manページとの違いは何もわかりません。それぞれが使用しているRNGもわかりませんし、オンラインでも何も見つかりません。ありがとう!