我正在尝试为随机数生成器编写停车场测试的实现。以下是我从中获取有关测试信息的来源:英特尔数学库文档和本文的第 4 页以及此处列出的概率密度的 phi 函数。
我用 C# 编写了测试的实现。它使用一个 100x100 的网格,其值最初设置为 null。然后我使用随机数生成器为 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 Sinclair 和 mine z 帮助解决这个问题。最终代码发布在下面。