2012-12-12 59 views
5

可能重複:
Random number generator only generating one random number只有通過調試器逐步完成代碼才能正確運行代碼?

我有點困惑這個幾分鐘前。我有以下代碼:

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; 
} 

相當簡單,它返回基於隨機生成的數字的enum值(基於系統時間)。不幸的是,由於某些奇怪的原因,我將所有塊都封裝成一種顏色或其他顏色,即使這種情況對於每一個塊都會投入遊戲中。然而,當我通過這個步驟與調試器,然後看到一些運行後的結果,我看到塊多,現在根據所提供的機會着色。我有點困惑,爲什麼會發生這種情況。

對於這個我使用MonoGame它採用了單聲道編譯器,而不是微軟的一個。這可能是問題嗎?我試圖內嵌把這段代碼到構造函數從它被稱爲在那裏,但我得到了同樣的結果(我猜編譯器內聯代碼反正)。

我試圖重新啓動Visual Studio它分開,而不是讓運行做的構建;沒有變化。

任何建議和幫助是極大的讚賞!

+1

嘗試移動隨機生成的方法的,應該幫助。 –

+0

'新的隨機()'種子使用時間,它保持不變幾毫秒。 – CodesInChaos

+0

它在調試中起作用的原因是調用之間有時間,而Random實際上獲得了不同的種子。 – Archy

回答

3

當你先後在一段很短的時間創造的Random多個實例,他們很可能會結束了,同時相關的種子值越來越初始化。

要解決這個問題,你應該初始化您Random作爲一個實例字段,而不是:

private readonly Random random = new Random(); 

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

    // ... 
} 
7

你應該實例化隨機只有一次(將其設置爲在構造私有字段和實例化),看到類似的問題:Random.Next returns always the same values

Random documentation

隨機數生成開始從種子值。如果同一 種子被反覆使用,會產生相同的一系列數字

在您的情況,您創建使用相同的種子(太接近的時間)隨機實例,你拿的第一個值,這將是給定的種子也是一樣。

4

你現在重新創建你的隨機數生成器每次你打電話給你的方法:

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

由於隨機數發生器的種子是基於時間,這將返回連續調用相同的值。

移動你的發電機產生的常規外:

Random random = new Random(); 
public blockType generateRandomBlock() 
{ 
相關問題