2010-01-19 61 views
2

以下代碼非常簡單 - 它用隨機選擇的像素填充設計表面 - 沒有什麼特別的(現在忽略第二種方法中的XXXXXXX)。C#繪圖,奇怪的行爲

private void PaintBackground() 
{ 
    Random rnd = new Random(); 

    Bitmap b = new Bitmap(this.Width, this.Height); 
    for (int vertical = 0; vertical < this.Height; vertical++) 
    { 
     for (int horizontal = 0; horizontal < this.Width; horizontal++) 
     { 
      Color randomColour = GetRandomColor(rnd); 
      b.SetPixel(horizontal, vertical, randomColour); 
     } 
    } 

    Graphics g = this.CreateGraphics(); 
    g.DrawImage(b, new Point(0, 0)); 
} 

public Color GetRandomColor(Random rnd) 
{ 
    XXXXXXXXXXXXXXXX 

    byte r = Convert.ToByte(rnd.Next(0, 255)); 
    byte g = Convert.ToByte(rnd.Next(0, 255)); 
    byte b = Convert.ToByte(rnd.Next(0, 255)); 

    return Color.FromArgb(255, r, g, b); 
} 

我的問題是這樣的......

如果更換與XXXXXXXXX 「隨機RND =新的隨機();」測試圖案完全變成相同顏色的水平條,因此不是隨機的。

有人向我解釋爲什麼這是?

至於我可以告訴在第二次嘗試,唯一的區別是,GetRandomColour方法創建並使用Random類的新實例,但我不明白如何使單槓..

回答

7

MSDN

隨機數生成開始 從種子值。如果重複使用相同的種子 ,則會生成同一系列的 數字。 產生不同序列的一種方法是使 的種子值與時間有關,從而 產生與每個Random的新實例不同的系列。默認情況下, 的 Random類的參數的構造函數使用系統時鐘 產生的種子值,而其 參數的構造函數可以利用基於 蜱在當前時間的數量 Int32值。然而,因爲時鐘具有有限的 分辨率,使用無參數 構造函數創建不同的隨機 對象創建 隨機數發生器產生 相同序列的隨機數。 以下示例說明 兩個隨機對象 緊密連續地被實例化,生成一系列隨機的 數字。

因此,給定相同的種子,隨機實例將產生相同的數字序列。在你的例子中,由於系統時鐘的有限分辨率,Random實例使用與種子相同的滴答計數創建,導致相同的序列。

連續調用GetRandomColor()在系統時鐘的一個時間片內執行。要測試這個,請嘗試用Thread.Sleep(1)減慢此方法。您應該看到生成不同的顏色。

+0

我太慢了,刪除了我的文章並給了你+1 – jdehaan 2010-01-19 12:59:02

3

你應用程序的運行速度非常快,PRNG正在初始化的種子在整個循環中保持不變。

因此它不是真正的隨機,因此名稱僞隨機數發生器。

+0

雖然在橫條不會有細微的變化嗎?它們幾乎完全對齊 – Grant 2010-01-19 12:53:57

+1

不,RNG使用相同的種子初始化,因此它會生成相同的結果。你的視野只是把它看作線條。 – leppie 2010-01-19 12:56:06

1

隨機創建時有一個默認的種子零。在該功能中重新創建它將始終給出相同的編號。在構造函數中創建它,並重用以獲得不同的隨機數。

+1

錯!種子基於tickcount之類的東西,否則你最終會得到一個真正蹩腳的隨機課程。 – leppie 2010-01-19 12:50:57

+0

你對我錯了。我記得當我實施粒子羣優化器時遇到了幾乎相同的問題。但是因爲每個粒子的序列幾乎相同,所以我認爲它必須相同。謝謝(你的)信息。 – affan 2010-01-19 12:58:31

1

蘭德姆並不是真正的隨機。他們是"Psuedo-random"。所有你真正做的(從機器的角度來看)都是一次又一次地在起始點產生相同的隨機數。你真正需要做的是傳遞構造函數一個「種子」或者有一個更高範圍的隨機,你可以調用Next()方法。

+0

所以在嘗試#2中 - 通過創建一個新的實例並詢問下一個(0,255)它每次都會有相同的返回值?這似乎很難相信..? – Grant 2010-01-19 12:51:55

+0

是的,因爲它們都有相同的起點。隨機性算法根本不是隨機的。就像文章所說,它是「隨機的」。它有一個明確的算法,所以給定相同的起始點,相同的種子,每次都會得到相同的結果。 – 2010-01-19 13:27:01