如何在Visual Studio中随机填充复选框
本文关键字:随机 填充 复选框 Studio Visual | 更新日期: 2023-09-27 18:14:36
这是我关于堆栈溢出的第一个问题。我正在研究一个鼓音序器,并希望实现一个按钮来随机填充80个复选框,表明鼓的声音被触发。目前我所拥有的只能随机填充80个盒子中的一个,但我希望每个盒子都有随机被填充的机会。我的代码的第一部分只是清除当前选择。下面是我的尝试代码:
private void button4_Click(object sender, EventArgs e)
{
List<CheckBox> Checkboxlist = new List<CheckBox>();
foreach (CheckBox control in this.Controls.OfType<CheckBox>())
{
Checkboxlist.Add(control);
control.Checked = false;
}
for (int i = 0; i <= 200; i++)
{
var random = new Random();
var r = random.Next(0, Checkboxlist.Count);
var checkbox = Checkboxlist[r];
checkbox.Checked = true;
}
}
感谢您的关注!
不要在循环中创建new Random()
。最好只声明一次,最好的方法是将其创建为静态成员。
private static Random random = new Random(); // Class member
private void button4_Click(object sender, EventArgs e)
{
List<CheckBox> Checkboxlist = new List<CheckBox>();
foreach (CheckBox control in this.Controls.OfType<CheckBox>())
{
Checkboxlist.Add(control);
control.Checked = false;
}
for (int i = 0; i <= 200; i++)
{
var r = random.Next(0, Checkboxlist.Count);
var checkbox = Checkboxlist[r];
checkbox.Checked = true;
}
}
原因是:
来源随机数的生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而为每个新的Random实例产生不同的序列。默认情况下,Random类的无参数构造函数使用系统时钟来生成其种子值
快速的for循环导致Random以相同的种子创建,因此Next
函数返回一系列数字的相同的第一个值。
你应该把Random声明移出for循环:
var random = new Random();
for (int i = 0; i <= 200; i++)
{
var r = random.Next(0, Checkboxlist.Count);
var checkbox = Checkboxlist[r];
checkbox.Checked = true;
}
要在所有实例中遍历并更改为随机值,这可能适合您。
private void button4_Click(object sender, EventArgs e)
{
List<CheckBox> Checkboxlist = new List<CheckBox>();
foreach (CheckBox control in this.Controls.OfType<CheckBox>())
{
Checkboxlist.Add(control);
control.Checked = false;
}
Random r = new Random();
int g = 0;
for ( int i = 0; i < Checkboxlist.Length; i++){
g = r.Next(0,1);
if(g ==1)
Checkboxlist[i].Checked = true;
}
}