乱数発生器の駐車場テストの実装を書こうとしています。テストに関する情報を入手しているソースは次のとおりです。Intel数学ライブラリのドキュメントとこのペーパーの4ページ、およびここにリストされている確率密度のphi関数。
テストの実装をC#で作成しました。値が最初にnullに設定されている100x100グリッドを使用します。次に、乱数ジェネレーターを使用して、xとyのランダムな整数を生成します。グリッドとそのネイバーのインデックスが空の場合、そのインデックスは1に設定されます。それ以外の場合、「クラッシュ」が発生したため、何も起こりません。
C#System.Randomジェネレーターを使用して実行しました。私は常に3079ポイント近くに駐車しているので、結果が正しいとは思いません。これは、私が得ることになっている平均よりも約500ポイント少ないです。また、2.21829146215425E-90のp値が得られます。
私のコードは以下の通りです。誰かがこれについて何か経験がありますか、または誰かが私の実装で間違っているかもしれない何かを見ることができますか?どんな助けでも大歓迎です。
private void RunParkingLotTest()
{
points = new int?[100,100];
int parked = 0;
for (int i = 0; i < 12000; i++)
{
int x = random.Next(100);
int y = random.Next(100);
if (IsSafeToPark(x, y))
{
points[x, y] = 1;
parked++;
}
}
Console.WriteLine("Parked: " + parked + "\nP value: " + PhiFunction((parked-3523)/21.9));
}
private bool IsSafeToPark(int x, int y)
{
return PointIsEmpty(x, y)
&& LeftOfPointIsEmpty(x, y)
&& RightOfPointIsEmpty(x, y)
&& BelowPointIsEmpty(x, y)
&& AbovePointIsEmpty(x, y);
}
private bool AbovePointIsEmpty(int x, int y)
{
if (y == 99)
{
return true;
}
else
return points[x, y + 1] == null;
}
private bool BelowPointIsEmpty(int x, int y)
{
if (y == 0)
{
return true;
}
else
return points[x, y - 1] == null;
}
private bool RightOfPointIsEmpty(int x, int y)
{
if (x == 99)
{
return true;
}
else
return points[x + 1, y] == null;
}
private bool LeftOfPointIsEmpty(int x, int y)
{
if (x == 0)
{
return true;
}
else
return points[x - 1, y] == null;
}
private bool PointIsEmpty(int x, int y)
{
return points[x, y] == null;
}
private double PhiFunction(double x)
{
//ϕ(x) = (2π)−½e−x2/2
return ((1 / Math.Sqrt(2 * Math.PI)) * Math.Exp(-(Math.Pow(x, 2)) / 2));
}
編集-私の元の実装の問題は
- ディスクの代わりに正方形をプロットしていました
- ポイントを整数値でプロットしただけです。代わりに10進数を使用する必要がありました。
- 上記の2つの結果として、距離チェックを変更する必要がありました
これを理解するのを手伝ってくれたChrisSinclairとminezに感謝します。最終的なコードは以下に掲載されています。