Rasgele sayı üreteçleri için otopark testinin bir uygulamasını yazmaya çalışıyorum. Test hakkında bilgilerimi aldığım kaynaklar: Intel math library documentation ve Page 4 of this paper ve here listelenen olasılık yoğunluğu için phi işleviyle birlikte.Neden rasgele sayı üreteçleri için park etme testinin uygulanmam kötü sonuçlara yol açıyor?
C# 'daki testin bir uygulamasını yazdım. Değerleri başlangıçta boş olarak ayarlanmış bir 100x100 ızgara kullanır. Daha sonra x ve y için rasgele tamsayılar üretmek için rasgele sayı üretecini kullanıyorum. Şebeke ve komşuların indeksi boşsa, bu dizin 1'e ayarlanır. Aksi halde, bir "çökme" olduğu için hiçbir şey olmuyor.
C# System.Random üreteci kullanarak koştum. Sonuçların doğru olduğuna inanmıyorum çünkü her zaman park ettiğim 3079'a yakın noktaya ulaşıyorum, ki ortalama 500'e yakın olmam gerekiyor. Ayrıca 2.21829146215425E-90 bir p-değeri verir.
Kodum aşağıda. Bu konuda herhangi bir tecrübesi olan var mı, yoksa uygulamamda yanlış yaptığım bir şeyi herkes görebilir mi? Herhangi bir yardım büyük takdir edilecektir.
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));
}
düzenleme - Ben bunun yerine sadece tamsayı değerleri noktaları çizilen
- benim orijinal uygulanması ile ilgili sorunlar vardı. Bunun yerine ondalık değerler kullanmalıydım. Yukarıdaki ikisinin bir sonucu olarak , bu bulmaktan yardım Chris Sinclair ve maden z benim mesafesi, kontrol edildiğinde
Teşekkür değiştirmek gerekiyordu. Son kod aşağıda yer almaktadır.
Eğer değişken ** rastgele ** başlattığınız kodu postalayabilir misiniz? –
Rastgele rastgele = yeni Rastgele(); C# System.Random sınıfı kullanıyorum. Varsayılan (zamana bağlı) tohum değerini kullanıyor. –
Aynı rasgele kullanılarak oluşturulan tüm sayıyı rasgele bir ** ** statik öğe olarak deneyin. –