我正在尝试创建一个动态添加的用户控件数组,其中每个用户控件都会分配一个随机颜色,以使用户能够更好地区分它,但是当我这样做时,它会生成颜色模式。它将创建10个具有相同颜色的用户控件,然后它将更改下一个10的颜色,我希望每个单独的颜色具有不同的颜色。
用户控件的代码:
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
{
}
}
提前致谢,非常感谢任何帮助!
答案 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();
}