2010-05-25 77 views
2

以下代碼片段僅以灰度返回。大部分時間我都爲此感到困擾。任何想法的原因是什麼?SolidBrush顏色僅返回灰度

using System.Drawing; 
    private Graphics _g; 

    public Form1() 
    { 
     InitializeComponent(); 
     _g = pictureBox1.CreateGraphics(); 
    } 

    private void x() 
    { 
     System.Drawing.Rectangle r = CreateCircle(e); 
     SolidBrush brsh = ChooseFillColor(); 
     _g.FillEllipse(brsh, r); 
    } 
    private SolidBrush ChooseFillColor() 
    { 
     return new SolidBrush(Color.FromArgb(RandomNumber(255), RandomNumber(255), RandomNumber(255))); 
    } 
    private int RandomNumber(int max) 
    { 
     Random random = new Random(); 
     return random.Next(max); 
    } 

回答

4

您每次都初始化一個新的Random對象。由於它默認使用當前時間作爲它的種子,並且如此快速地調用以使時間不變(在Windows上,計時器的準確度大約爲15毫秒),所以您始終會得到相同的隨機數。相反,在你的類中創建一個靜態的Random對象。

編輯:另外,考慮讓你的RandomNumber方法也是靜態的,或者把它(和靜態隨機對象一起)放在靜態類中。

+1

好點,我說完全放棄了'RandomNumber()'方法,因爲它不再是必要的 - 只需要調用'rng.Next( 256)'當你需要它時(注意256是一個獨佔的上限,所以255將是返回的最高值) – 2010-05-25 21:02:54

1

試着讓你的實例Random成爲一個靜態成員。我之前遇到過同樣的問題,random.Next(...)沒有返回預期值,並解決了問題。

2

您撥打RandomNumber的過程發生得如此之快,以至於RNG的播種數量相同,因此您可以爲每次呼叫獲得相同的整數......這意味着您的所有顏色將具有相同的R,G,和B值(即灰度)。

移動你Random對象的方法之外爲靜態成員:

static Random rng = new Random(); 

private int RandomNumber(int max) 
{ 
    return rng.Next(max); 
}