2012-01-21 79 views
4

所以我試圖用「下雨綠色代碼」來創建一個類似矩陣的程序。一切都進展良好,直到我決定將所有字符串實例放入列表並從中進行繪製/更新。爲了達到適當的效果,我需要隨機化幾件事情。多個對象的隨機數生成

所有字符串都被創建並存儲在您在for循環中看到的列表中。間隔和下降速度的隨機數字會改變字符串下落的速度,以及單個字符以什麼速度在精靈表中旋轉。

出於某種原因,雖然我只是得到一面文字的牆壁,並且所有的精靈都以相同的速度旋轉。這些類和它們各自的功能可以工作......所以問題是我在做什麼我的隨機數初始化錯了?

for (int i = 0; i < (wWidth/30); i++) 
{ 
    Random random = new Random(new System.DateTime().Millisecond); 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString(chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
} 
+6

您需要在'for'循環之外創建您的隨機實例。 –

回答

6

您需要創建random實例的for外循環:

Random random = new Random(new System.DateTime().Millisecond); 
for (int i = 0; i < (wWidth/30); i++) 
{ 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString( 
       chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
} 

在很短的運行循環,與new System.DateTime().Millisecond播種將產生相同種子價值。因此,相同的隨機數。

+1

也可以注意到Random的無參構造函數使用系統時間作爲種子,所以創建一個新的'DateTime'可能不需要(只需要執行'new Random()')。 –

+0

我可能會SWORN我試過這個......它確實工作謝謝你們。 –

+0

不要擔心這是一個相當常見的錯誤,在我上一個遊戲項目中,幾乎設計團隊中的每個腳本編寫者每次需要一個隨機數時都會重新發送隨機數生成器。而使事情變得更糟的是他們使用的Time()方法被破壞了,所以種子總是一樣的。這是一個MMO,他們沒有注意到它被破壞,因爲服務器運行了好幾天,所以當有人登錄它時已經運行了足夠長的時間,以至於它不明顯,除了每次都重新播放的情況。無論如何,我現在在散漫。 –

2

你的循環是「快」,因此爲每個迴路是快於1毫秒的new Random(new System.DateTime().Millisecond)總是會產生相同的結果 - 以下應該工作:

Random random = new Random(new System.DateTime().Millisecond); 
for (int i = 0; i < (wWidth/30); i++) 
{ 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString(chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
}