Próbuję napisać implementację testu parkingu dla generatorów liczb losowych. Oto źródła, z których otrzymuję informacje o teście od: Intel math library documentation i Page 4 of this paper wraz z funkcją phi dla gęstości prawdopodobieństwa wymienionej na here.Dlaczego moja implementacja testu parkingu dla generatorów liczb losowych daje złe wyniki?
Napisałem implementację testu w języku C#. Wykorzystuje siatkę 100x100, której wartości są początkowo ustawione na null. Następnie używam generatora liczb losowych do generowania losowych liczb całkowitych dla x i y. Jeśli ten indeks siatki i jej sąsiadów jest pusty, indeks zostaje ustawiony na 1. W przeciwnym razie nic się nie dzieje, ponieważ wystąpił "awaria".
Uruchomiłem go przy użyciu generatora C# System.Random. Nie wierzę, że wyniki są poprawne, ponieważ zawsze mam bardzo blisko 3079 punktów zaparkowanych, co jest około 500 razy krótsze od średniej, jaką powinienem dostać. Daje także wartość p o wartości 2.21829146215425E-90.
Mój kod znajduje się poniżej. Czy ktokolwiek ma z tym jakieś doświadczenie lub czy ktoś może zobaczyć coś, co robię nieprawidłowo w mojej implementacji? Każda pomoc będzie bardzo ceniona.
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));
}
edycja - Problemy z mojego pierwotnego wdrożenia były
- byłem wykreślenie kwadraty zamiast dysków
- ja tylko na wykresie punktów w wartościach całkowitych. Zamiast tego powinienem był użyć wartości dziesiętnych.
- W wyniku powyższej dwóch, musiałem zmienić czek Odległość
Dzięki Chris Sinclair i kopalni Z pomocy w figurującego to. Ostateczny kod został zamieszczony poniżej.
Czy możesz napisać kod, w którym zainicjujesz zmienną ** random **? –
Losowe losowe = nowe Losowe(); Używam klasy C# System.Random. Używa domyślnej (opartej na czasie) wartości początkowej. –
Możesz chcieć, abyś spróbował sklepu, który ** losowo ** był statyczny, tak aby wszystkie liczby były generowane przy użyciu tego samego materiału początkowego. –