生成随机颜色每次都会产生相同的颜色

时间:2015-09-21 04:22:55

标签: c# winforms random user-controls

我正在尝试创建一个动态添加的用户控件数组,其中每个用户控件都会分配一个随机颜色,以使用户能够更好地区分它,但是当我这样做时,它会生成颜色模式。它将创建10个具有相同颜色的用户控件,然后它将更改下一个10的颜色,我希望每个单独的颜色具有不同的颜色。

enter image description here

用户控件的代码:

public partial class EquationBox : UserControl
{
    public EquationBox()
    {
        InitializeComponent();

        this.panel4.BackColor = RandomColor();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        this.textBox1.Text = "";
    }

    private Color RandomColor()
    {
        Random rnd = new Random();
        /*KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor));
        KnownColor randomColorName = names[r.Next(names.Length)];
        Color randomColor = Color.FromKnownColor(randomColorName);
        return randomColor;*/

        Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));
        return randomColor;
    }
}

form1的代码:

    public partial class Form1 : Form
{
    public static EquationBox[] EquationBoxArray = new EquationBox[100];

    public Form1()
    {
        InitializeComponent();

        for (int x = 0; x < 100; x++)
        {
            EquationBoxArray[x] = new EquationBox();
            EquationBoxArray[x].Parent = flowLayoutPanel1;

            EquationBoxArray[x].Visible = false;
        }
    }

    private void add_line_Click(object sender, EventArgs e) //Add Line
    {
          for(int x = 0; x < 100; x++)
          {
              if(!EquationBoxArray[x].Visible)
              {
                  EquationBoxArray[x].Visible = true;
                  EquationBoxArray[x].Refresh();
                  break;
              }
          } 
    }

    private void clear_Click(object sender, EventArgs e) //Clear Lines
    {
        for (int x = 0; x < 100; x++)
        {
            EquationBoxArray[x].Visible = false;
            EquationBoxArray[x].ResetText();
        } 
    }

    private void Form1_SizeChanged(object sender, EventArgs e) //Window Size Changed
    {

    }
}

提前致谢,非常感谢任何帮助!

5 个答案:

答案 0 :(得分:1)

Random类只是一个伪随机数生成器,由构造函数中的seed参数控制。为了更好地分配随机数,请尝试在循环外部创建Random对象,或者每次使用不同的值对其进行播种。

例如

public partial class EquationBox
{
    private static Random rnd;

    static EquationBox()
    {
        rnd = new Random();
    }

    public EquationBox()
    {
        this.panel4.BackColor = GetRandomColor();
    }

    private Color GetRandomColor()
    {
        Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));
        return randomColor;
    }
}

答案 1 :(得分:0)

您需要创建全局Random实例,或使用其他构造函数 https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx

答案 2 :(得分:0)

每次需要新的随机颜色时,您的错误都来自于创建随机数生成器。 RNG通常以当前时间播种,因为您正在快速创建新的RNG以获得相同的种子。

public partial class EquationBox
{
 static Random rnd = new Random();

 public EquationBox()
 {
    InitializeComponent();

    lock (rnd)
    {
      this.panel4.BackColor = Color.FromArgb(rnd.Next(257), rnd.Next(257), rnd.Next(257));
    }
  }
}

Random.Next不是线程安全的,所以我周围有一个lock。它还返回值 LESS 而不是max参数。因此,您很可能希望通过257而不是256

答案 3 :(得分:0)

将Random更多地添加到一个字段中,然后在RandomColor函数中使用它,如下所示。

Random _rnd = new Random();

private Color RandomColor()
{


    Color randomColor = Color.FromArgb(_rnd.Next(256), _rnd.Next(256), _rnd.Next(256));
    return randomColor;
}

这解决了这个问题,因为Random使用种子来初始化伪随机数生成器,这是自计算机启动以来的毫秒数。因此,如果您在相同的毫秒内创建多个Random,它将以相同的种子开始。

答案 4 :(得分:0)

你应该只使用一个随机类的实例。问题可能是因为你每次调用RandomColor时都在创建一个新的Random实例。    您可以将其移至另一个班级

public class MyRandom
{
    private  static Random _randColor=new Random();

     private Color GetRandomColor()
     {
       Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));
       return randomColor;
     }

}  

并在您的用户控件中使用

调用它
public EquationBox()
{
    InitializeComponent();

    this.panel4.BackColor = MyRandom.GetRandomColor();
}