2016-10-24 1 views
1

これはスタックオーバーフローに関する私の最初の質問です。私はドラムシーケンサーで作業しており、ドラム音がトリガーされていることを示す80個のチェックボックスをランダムに入力するボタンを実装したいと考えています。現在私が持っているものは、無作為に80の1つの箱だけを塗りつぶしていますが、それぞれにランダムな確率で塗りつぶしてもらいたいです。私のコードの最初の部分は、現在の選択を単にクリアするだけです。以下は私の試みです:ランダムに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

チェックボックスリスト[r] .Checked = true;これは –

+1

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

その理由は次のとおり

乱数発生シード値から始まります。同じシードが繰り返し使用されると、同じ一連の番号が生成されます。異なるシーケンスを生成する1つの方法は、シード値を時間に依存させることであり、それによって、ランダムの各新しいインスタンスと異なる系列を生成する。デフォルトでは、ランダムクラスのパラメータなしのコンストラクタは、そのシード値を生成するために、システムクロックを使用しています

Source

迅速なforループランダム同じシードを使用して作成されますので、Next関数は一連の数値の最初の同じ値を返しました。

+1

さらにイベントハンドラから移動してください –

+0

恐ろしいです!それは働いた!本当にありがとうございました!!! – murderface

+0

最初のforeachループにチェックを入れる方が良い:control.Checked = random.Next(0,99)> = 50。 //(例えば、検査する50%) –

1

あなたは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; 
} 
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; 
    } 
} 
関連する問題