2010-04-28 23 views
9

Merhaba ben C# ile rasgele sayı üreten bazı sorunlar yaşıyorum Şimdi bu işleve sahibim.Rastgele karşılaşma o kadar rasgele değil

public Color getRandomColor() 
{ 
    Color1 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255)); 
    Color2 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255)); 
    Color3 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255)); 
    Color color = Color.FromArgb(Color1, Color2, Color3); 
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name); 
    return color; 
} 

Şimdi() orada ben aynı örneği hatası olabilir olasılığını ayıklamak istiyorum, çünkü, yani yeni Random ALOT olduğunu fark edebilirsiniz.

Şimdi bu işlevi 8 kez, birkaç kez çalıştırıyorum. Şimdi burada çıkışlar.

R: 65 G: 65 B: 65 = ff414141 
R: 242 G: 242 B: 242 = fff2f2f2 
R: 205 G: 205 B: 205 = ffcdcdcd 
R: 40 G: 40 B: 40 = ff282828 
R: 249 G: 249 B: 249 = fff9f9f9 
R: 249 G: 249 B: 249 = fff9f9f9 
R: 94 G: 94 B: 94 = ff5e5e5e 
R: 186 G: 186 B: 186 = ffbababa 

R: 142 G: 142 B: 142 = ff8e8e8e 
R: 190 G: 190 B: 190 = ffbebebe 
R: 19 G: 19 B: 19 = ff131313 
R: 119 G: 119 B: 119 = ff777777 
R: 119 G: 119 B: 119 = ff777777 
R: 75 G: 75 B: 75 = ff4b4b4b 
R: 169 G: 169 B: 169 = ffa9a9a9 
R: 127 G: 127 B: 127 = ff7f7f7f 

R: 73 G: 73 B: 73 = ff494949 
R: 27 G: 27 B: 27 = ff1b1b1b 
R: 125 G: 125 B: 125 = ff7d7d7d 
R: 212 G: 212 B: 212 = ffd4d4d4 
R: 174 G: 174 B: 174 = ffaeaeae 
R: 0 G: 0 B: 0 = ff000000 
R: 0 G: 0 B: 0 = ff000000 
R: 220 G: 220 B: 220 = ffdcdcdc 

bu yine çok tesadüfi değildir görebiliyorum ama neden bu olur doz gibi? ve buna nasıl karşı koyabilirim?

+0

Aynı sorun normalleştirilmiş bir aralıkta rastgele renkler üretiyordu. Bir tohum sağlamadan hızlı bir yol, aynı rastgele akışı kullanarak birlikte bir çift değere izin vermektir. Kesinlik eksikliği, ancak biraz daha çeşitli rasgele dağıtım elde etmek için kullanılabilir. E.g. int x = rng.Next()^rng.Next(); int magnitude = x * x; float değeri = x/(float) büyüklüğü; –

+0

Bu yöntemi kullanarak, aşağıdakiler ile biraz daha iyi bir renk dağılımı oluşturabilirsiniz. Renk = renk = yeni Renk ( (bayt) (rand.Next (0, 255)^rand.Next (0, 255)), (bayt) (rand.Next (0, 255)^rand.Next (0, 255)), (bayt) (rand.Next (0, 255)^rand.Next (0, 255)), (bayt) (rand.Next (0, 255)^rand.Next (0 , 255))) –

cevap

28

İhtiyacınız olan her bir değer için yeni bir Random oluşturuyorsunuz.

Benzersiz bir Random nesnesi oluşturmayı ve .Next() işlevini birden çok kez çağırmayı deneyin.

public Color getRandomColor() 
{ 
    Random rand = new Random(); 

    Color1 = rand.Next(rand.Next(0, 100), rand.Next(200, 255)); 
    Color2 = rand.Next(rand.Next(0, 100), rand.Next(200, 255)); 
    Color3 = rand.Next(rand.Next(0, 100), rand.Next(200, 255)); 
    Color color = Color.FromArgb(Color1, Color2, Color3); 
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name); 
    return color; 
} 

MSDN documentation on Random object Alındığı:

Varsayılan olarak

, Random sınıfının parametresiz oluşturucu onun parametreli yapıcı sayısına dayalı bir Int32 değeri alabilir iken, onun tohumu değerini üretmek için sistem saatini kullanır Geçerli zamanda keneler. Saat sonlu çözünürlüğe sahip olmadığından dolayı, yakın arka arkaya farklı Rastgele nesneleri oluşturmak için parametresiz kurucu kullanılarak bunun bir örneğini kullanırken Rastgele daha iyi çalışır rasgele sayı

+4

Evet, bu bir cevaptır. Rastgele Örnekler birbiri ardına çok hızlı bir şekilde yaratıldı, aynı değeri verme eğilimi var. Bunun, bilgisayar saatiyle tohumlandığını, ama bu vahşi varsayımdan başka bir şey olmadığı anlamına geldiğini sanıyorum. –

+1

Tam olarak. Rastgele 2 kurucu var. Parametresiz bir kişi, şu anki zamanı tohum olarak kullanır. Tam sayı alan birini de kullanabilirsiniz. Yani tohum olarak geçtiğiniz argümanı kullanacaktır. – emzero

+0

Kodum, başlangıçta böyle bir yardımcı olup olmadığını görmek için birçok örneği oluşturduk. 164 G: 78 B: 145 = ffa44e91 R: 206 G: 20 B: 149 = ffce1495 R: 206 G: 20 B: 149 = ffce1495 R: 73 G: 60 B Fakat şimdi R alır: 94 = ff493c5e R: 147 G: 94 B: 101 = ff935e65 R: 212 G: 123 B: 61 = ffd47b3d R: 98 G: 79 B: 70 = ff624f46 R: 85 G: 110 B: 79 = ff556e4f Biraz daha rasgele ama sonuç 2 ve 3'ün aynı olduğunu görürseniz. – Androme

1

özdeş dizileri üretmek rasgele sayı jeneratörler oluşturur.

bu deneyin:

public Color getRandomColor() 
{ 
    var random = new Random(); 
    Color1 = random.Next(random.Next(0, 100), random.Next(200, 255)); 
    Color2 = random.Next(random.Next(0, 100), random.Next(200, 255)); 
    Color3 = random.Next(random.Next(0, 100), random.Next(200, 255)); 
    Color color = Color.FromArgb(Color1, Color2, Color3); 
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name); 
    return color; 
} 
+0

Tek bir rasgele kullanmanın dışında bir şey nasıl daha yavaş düzenlenir? Kesinlikle 'daha rastgele' değil mi? – Will

+1

İşlev çağrıldığında her seferinde aynı "rastgele" rengi bile yardımcı olur. – Miles

5

Sen oluştururken birçok Rastgele sırayla nesneleri, onları aynı/neredeyse aynı zaman damgası ile ekildi neden olur ki. Böylece rastgele sayılar üretiyorlar, ancak bunlar arasında eşittir.

Tek bir rasgele örnek oluşturmayı ve tüm Rasgele sayı ihtiyaçlarınız için bunu kullanmayı deneyin.

7

Her new Random(), seeded with the current time'dur.

Hızla arka arkaya birkaç Random örneğini oluşturursanız ve makineniz, aynı tohumu almak için yeterince yakın olduklarından yeterince hızlı koşarsanız, aynı değer sıralarını döndürürler!

Her bir değeri almak için .Next() numaralı telefonu arayarak tek bir Random kullanın.

Şimdi ben aynı örneği hata olabileceğini olasılığını ayıklamak istiyorum, çünkü() orada, o yeni Random ALOT olduğunu fark edebilirsiniz.

Bu bir yanlıştır; Tek bir Random numaralı numaradan bir sayı akışı eşit olarak dağıtılır - bu, işi rastgele yapmaya başladı.