2012-12-12 39 views
5

Olası Çoğalt:
Random number generator only generating one random numberKod, yalnızca hata ayıklayıcı ile adım atıldığında doğru şekilde çalışıyor mu?

ben biraz bu birkaç dakika önce ile şaşırmıştı. (Sistem zaman göre)

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 
    int makeBlockOfType = random.Next(0, 100); 

    blockType t = blockType.normal; 
    if (makeBlockOfType <= 80 && makeBlockOfType >= 60) 
    { 
     t = blockType.blue; 
    } 
    else if (makeBlockOfType > 80 && makeBlockOfType <= 95) 
    { 
     t = blockType.orange; 
    } 
    else if (makeBlockOfType > 95 && makeBlockOfType <= 100) 
    { 
     t = blockType.green; 
    } 

    return t; 
} 

oldukça basit, bir rasgele oluşturulmuş sayısına dayalı bir enum değer iade: Aşağıdaki kodu vardır. Ne yazık ki, bazı garip nedenlerden dolayı, her bir blokun oyuna sokulmasına rağmen, bir blok ya da diğeri bloklarım var. Bununla birlikte, hata ayıklayıcısını kullanarak bu adımı attığımda ve sonra da bazı çalışmalardan sonra sonuçları gördüğümde, blokların şu anda sağlanan şansa bağlı olarak çok renkli olduğunu görüyorum. Bunun neden olduğu konusunda biraz kafam karıştı.

Bunun için Microsoft yerine Mono derleyicisini kullanan MonoGame kullanıyorum. Sorun bu olabilir mi? Bu kodu, çağrılmakta olduğu yerden yapıcıya sıraya koymaya çalıştım ama aynı sonucu alıyorum (derleyicinin kodu yine de satır içi olduğunu tahmin ediyorum).

Visual Studio'yu yeniden çalıştırmayı denedim; değişiklik yok.

Her türlü öneri ve yardım büyük beğeni topluyor!

+1

deneyin yönteminin dışına Rastgele oluşturulmasını taşımak için, yani yardımcı olmalıdır. –

+0

'Yeni rasgele() tohumları kullanarak, birkaç milisaniye sabit kalan süreyi kullanın. – CodesInChaos

+0

Hata ayıklamada çalışmasının nedeni, çağrılar ile Rastgele arasında zamanın olması, aslında farklı tohumlar almasıdır. – Archy

cevap

3

Random birden çok örneğini çok kısa bir süre içinde ardışık olarak oluşturduğunuzda, aynı zamana bağlı çekirdek değeriyle başlatılmaya başlaması muhtemeldir.

Bu sorunu aşmak için, bunun yerine bir örnek alanı olarak sizin Random başlatmak olmalıdır:

private readonly Random random = new Random(); 

public blockType generateRandomBlock() 
{ 
    int makeBlockOfType = random.Next(0, 100); 

    // ... 
} 
7

Sadece bir kez (kurucudaki özel alan ve instanciate olarak ayarlamak) Rastgele instanciate gerektiğini, benzer bakın soru: bir tohum değerinden

rastgele sayı üretme başlar: Random.Next returns always the same values

Random documentation bakınız. Aynı tohum defalarca kullanılırsa, sayıların aynı seri Senin durumunda

oluşturulur, siz (zaman içinde çok yakın) aynı tohumla bir Rastgele örneği oluşturun ve olacak olan ilk değerini almak Belirli bir tohum için aynı. rasgele sayı üreteci tohum olarak

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 

bu ardışık aramalar için aynı değeri döndürecektir zaman dayanmaktadır:

4

Her zaman size yöntemini çağırın sizin rastgele sayı üreteci yeniden oluşturuyorsunuz.

rutin dışında jeneratör sizin oluşturma taşıyın:

Random random = new Random(); 
public blockType generateRandomBlock() 
{