我正在嘗試爲隨機數生成器編寫停車場測試的實現。以下是我獲得有關測試信息的來源:Intel math library documentation和Page 4 of this paper以及列出的概率密度的phi函數here。爲什麼我對隨機數發生器產生不良結果的停車場測試實施?
我在C#中編寫了一個測試的實現。它使用其值初始設置爲空的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));
}
編輯 - 我原來實行的問題是
- 我正在策劃的廣場,而不是磁盤
- 我只在整數值繪製點。我應該使用十進制值。
- 作爲上述兩者的結果,我需要改變我的距離檢查
感謝Chris辛克萊和礦山z計算幫助搞清楚了這一點。最終的代碼發佈在下面。
你可以發佈你的代碼在哪裏你初始化變量**隨機**? –
Random random = new Random();我正在使用C#System.Random類。它使用默認(基於時間)種子值。 –
您可能希望嘗試使用** random **作爲靜態內容,以便使用相同種子生成所有數字。 –