私はそのような実験をしました - C と C# から 1000 万の乱数を作りました。そして、ランダムな整数の15ビットから各ビットが設定されている回数を数えました。(C は までのランダムな整数のみをサポートするため、15 ビットを選択しました0x7fff
)。
私が持っているのはこれです:
私は2つの質問があります:
最も可能性の高いビットが 3 つあるのはなぜですか?
C
ビット8,10,12
が最も可能性が高い場合。そして、C#
ビット単位6,8,11
が最も可能性が高いです。また、C# の最も可能性の高いビットは、C の最も可能性の高いビットと比較して、ほとんど2 つの位置だけシフトされているようです。どうしてこれなの ?C#は他のRAND_MAX定数を使用しているためですか?
私のテストコード
C
:
void accumulateResults(int random, int bitSet[15]) {
int i;
int isBitSet;
for (i=0; i < 15; i++) {
isBitSet = ((random & (1<<i)) != 0);
bitSet[i] += isBitSet;
}
}
int main() {
int i;
int bitSet[15] = {0};
int times = 10000000;
srand(0);
for (i=0; i < times; i++) {
accumulateResults(rand(), bitSet);
}
for (i=0; i < 15; i++) {
printf("%d : %d\n", i , bitSet[i]);
}
system("pause");
return 0;
}
そして、次のテストコードC#
:
static void accumulateResults(int random, int[] bitSet)
{
int i;
int isBitSet;
for (i = 0; i < 15; i++)
{
isBitSet = ((random & (1 << i)) != 0) ? 1 : 0;
bitSet[i] += isBitSet;
}
}
static void Main(string[] args)
{
int i;
int[] bitSet = new int[15];
int times = 10000000;
Random r = new Random();
for (i = 0; i < times; i++)
{
accumulateResults(r.Next(), bitSet);
}
for (i = 0; i < 15; i++)
{
Console.WriteLine("{0} : {1}", i, bitSet[i]);
}
Console.ReadKey();
}
どうもありがとう !!ところで、OS は Windows 7、64 ビット アーキテクチャ、Visual Studio 2010 です
。EDIT
@David Heffernan に感謝します。ここでいくつかの間違いを犯しました:
- C と C# プログラムのシードは異なっていました (C はゼロを使用し、C# - 現在時刻を使用していました)。
Times
結果の再現性を調査するために、変数の値を変えて実験することはしませんでした。
最初のビットが設定される確率が random() が呼び出された回数にどのように依存するかを分析したときに得たものは次のとおり
です。(C/C# PRNG で十分であるという何らかの形の確認を除いて:-))。