我有一个带有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个标签都分配了相同的背景颜色,而不是每个标签都是单独随机化的。
我做错了什么?
答案 0 :(得分:6)
问题的可能原因
这是因为每次调用Random
方法时都会创建RandomColor()
对象,并且几乎同时调用它几次。
<强>解释强>
当你写new Random();
时,伪随机函数是根据当前时间用种子启动的。 Seed是一个值,用于确定Random
对象返回的值(伪随机函数的值)。这意味着当您使用相同的种子创建两个Random
对象时,它们会在后续的Next()
方法中返回相同的值。
在你的情况下,你几次调用该方法,因此种子可能是相同的,这就是为什么它为所有标签返回相同的值。
建议的解决方案
为了解决这个问题,请将Random rand = new Random();
移到方法之外,只为类实例创建一次。
答案 1 :(得分:0)
“如果你在方法级别使用了一个新的Random()作为一个本地时间相关的种子会重复自己。” link 在类中使用随机的静态变量:
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;
}
答案 2 :(得分:0)
尝试类似的东西
static Random _r = new Random();
static void F()
{
int n = _r.Next(5);
// Can return 0, 1, 2, 3, or 4
Console.WriteLine(n);
}
上的精彩页面