2016-10-24 4 views
1

Так что это мой первый вопрос о переполнении стека. Я работаю над барабанным секвенсором и хочу реализовать кнопку, чтобы случайным образом заполнить 80 флажков, которые указывают, что звук барабана запускается. В настоящее время я набираю только одну коробку из 80 случайных чисел, но я хочу, чтобы каждый из них имел случайную возможность быть заполненным. Первая часть моего кода просто очищает текущий выбор. Вот моя попытка ввести следующий код:Как случайно заполнять флажки в C# - Visual Studio

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; 
    } 
} 

Спасибо, что посмотрели!

+0

Checkboxlist [r] .Checked = true; Сделайте это –

+1

move 'var random = new Random();' из цикла или у вас будет случайная последовательность * сильно искажена * –

ответ

3

Не создавайте 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. По умолчанию, конструктор без параметров случайного класса использует системные часы, чтобы произвести его начальное значение,

Source

Стремительное для цикла вызывают случайные быть созданы с той же семени, так что Next функция вернула одно и то же первое значение ряда чисел.

+1

Еще лучше, переместите его из обработчика событий –

+0

Удивительный! Сработало! Большое спасибо всем вам!!! – murderface

+0

Лучше поставить проверку в первый цикл foreach: control.Checked = random.Next (0,99)> = 50. // (например, 50% для проверки) –

1

Вы должны переместить Случайное объявление из для цикла:

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; 
} 
0

Чтобы пройти и изменить случайные значения во всех случаях, это может работать для вас.

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; 
    } 
}