2010-05-25 93 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); 
}