如何在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;
    }
}

感谢您的关注!

如何在Visual Studio中随机填充复选框

不要在循环中创建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;
    }
}