使用随机对象生成颜色
本文关键字:颜色 对象 随机 | 更新日期: 2023-09-27 18:34:44
我有一个非常简单的表单,其中包含 16 个标签的网格,我希望从我选择的 12 种颜色中随机设置每个标签的背景颜色。
这是我的代码:
private void btnRandom_Click(object sender, EventArgs e)
{
txtA1.BackColor = RandomColor();
txtA2.BackColor = RandomColor();
txtA3.BackColor = RandomColor();
txtA4.BackColor = RandomColor();
txtB1.BackColor = RandomColor();
txtB2.BackColor = RandomColor();
txtB3.BackColor = RandomColor();
txtB4.BackColor = RandomColor();
txtC1.BackColor = RandomColor();
txtC2.BackColor = RandomColor();
txtC3.BackColor = RandomColor();
txtC4.BackColor = RandomColor();
txtD1.BackColor = RandomColor();
txtD2.BackColor = RandomColor();
txtD3.BackColor = RandomColor();
txtD4.BackColor = RandomColor();
}
private Color RandomColor()
{
Random rand = new Random();
int r = rand.Next(1, 12);
switch (r)
{
case 1:
return Color.FromKnownColor(KnownColor.DodgerBlue);
case 2:
return Color.FromKnownColor(KnownColor.MediumAquamarine);
case 3:
return Color.FromKnownColor(KnownColor.Teal);
case 4:
return Color.FromKnownColor(KnownColor.OrangeRed);
case 5:
return Color.FromKnownColor(KnownColor.LightCoral);
case 6:
return Color.FromKnownColor(KnownColor.Red);
case 7:
return Color.FromKnownColor(KnownColor.MediumOrchid);
case 8:
return Color.FromKnownColor(KnownColor.MediumPurple);
case 9:
return Color.FromKnownColor(KnownColor.DarkOrchid);
case 10:
return Color.FromKnownColor(KnownColor.Lime);
case 11:
return Color.FromKnownColor(KnownColor.PaleGreen);
case 12:
return Color.FromKnownColor(KnownColor.SeaGreen);
default:
return Color.FromKnownColor(KnownColor.White);
}
}
但正在发生的事情是,所有 16 个标签都被分配了相同的背景颜色,而不是每个标签都单独随机化。
我做错了什么?
问题的可能原因
这是因为每次调用RandomColor()
方法时都会创建Random
对象,并且几乎同时调用它几次。
解释
当您编写new Random();
伪随机函数时,伪随机函数将使用基于当前时间的种子启动。种子是确定Random
对象返回的值(伪随机函数的值(的值。这意味着,当您使用相同的种子创建两个Random
对象时,它们在后续Next()
方法中返回相同的值。
在您的情况下,您调用该方法几次,因此种子可能是相同的,这就是为什么它为所有标签返回相同的值。
建议的解决方案
为了修复它,请将Random rand = new Random();
移到方法之外,以便只为类实例创建一次。
尝试类似的东西
static Random _r = new Random();
static void F()
{
int n = _r.Next(5);
// Can return 0, 1, 2, 3, or 4
Console.WriteLine(n);
}
随机 http://www.dotnetperls.com/random 上的伟大页面
"如果您在方法级别使用新的 Random((,因为本地时间相关种子会重复。在类中使用静态变量进行随机:
private static Random rand = new Random();
private void btnRandom_Click(object sender, EventArgs e)
{
//code here
}
private Color RandomColor()
{
int r = rand.Next(1, 12);
//switch here
return Color.White;
}