如何在c#中随机填充复选框-Visual Studio [重复]

Posted

技术标签:

【中文标题】如何在c#中随机填充复选框-Visual Studio [重复]【英文标题】:How to randomly fill checkboxes in c# - Visual Studio [duplicate] 【发布时间】:2017-03-06 17:08:13 【问题描述】:

所以这是我关于堆栈溢出的第一个问题。我正在开发一个鼓音序器,并希望实现一个按钮来随机填充 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;
    

感谢您的收看!

【问题讨论】:

复选框列表[r].Checked = true;这样做 var random = new Random();移出循环,否则您将得到随机序列严重歪斜 【参考方案1】:

不要在循环内创建new Random()。 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类的无参构造函数使用系统时钟来生成它的种子值,

Source

快速的 for 循环导致 Random 使用相同的种子创建,因此 Next 函数返回相同的数字系列的第一个值。

【讨论】:

更好的是,将其移出事件处理程序 太棒了!得到它的工作!非常感谢大家!!! 最好将检查放在第一个 foreach 循环中:control.Checked = random.Next(0,99)>=50。 //(例如 50% 待检查)【参考方案2】:

要在所有情况下检查并更改为随机值,这可能对您有用。

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;
    

【讨论】:

【参考方案3】:

您应该将 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;

【讨论】:

以上是关于如何在c#中随机填充复选框-Visual Studio [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用线程填充随机数的数组

Visual Studio C# 更新本地化语言 resx

在 Visual C# 中将选定行从 DataGridView 移动到另一个

调试由 C# Visual Studio 2010 插件导入的 C++ dll

获取两个日期时间选择器选择的两天之间的记录,并在 Visual Studio C# 中用它们填充数据网格视图

通过列表框项目选择c#更改复选框的状态