2017-11-27 18 views
1

ノーリピートで1〜80の番号を生成する関数を記述しようとしています。ノーリピート番号を生成する関数#

問題は、複製が存在するため、私の発電機が正しく動作していないことです。

public void generator() // сделать по кнопке, но пока что проверка тип на работоспособность 
    { 
     Random rand = new Random(); 

     int[] arr = new int[20]; 
     int temp = 0; 
     foreach (TextBox c in panel1.Controls) 
     { 
      for (int i = 0; i < 20; i++) 
      { 
       arr[i] = rand.Next(1, 80); 
       temp = arr[i]; 
       for (int j = 0; j < i; j++) 
       { 
        while (arr[i] == arr[j]) 
        { 
         arr[i] = rand.Next(1, 80); 
         j = 0; 
         temp = arr[i]; 
        } 
        temp = arr[i]; 
       } 
       c.Text = arr[i].ToString(); 
      } 

     } 

    } 

私はthis solutionを使用しようとしましたが、私はそこListから番号を取得する方法を理解いけません。

、私に

+5

私はそれがリストをシャッフルする方が簡単だと思う '[1、2、3、4、5、...、80]':あなたは例を見ることができます

。 – martijnn2008

+1

"リンク"とは何ですか?それはリンクと呼ばれる任意の変数を持っていません – BugFinder

+1

ウィキペディアとこのサイトでフィッシャー - イェイツのシャッフルを探します。 –

答えて

2

を助ける少量で乱数を生成するために、より一貫性のある方法は、80を介して1からリストを作成し、そのリストからランダムに20個のアイテムを引っ張っているしてください。

Fisher-Yates shuffle

-1

重複値を回避するための別の方法は、「HashSetの」オブジェクトを使用することができます。これにより、異なる値のリストを作成することができます。 乱数には、HashSetオブジェクトを使用できます。次に、これらのアイテムをスキャンし、必要な場所に入力することができます。 HashSetの唯一の問題は、インデックスがないため、Listオブジェクトに変換する必要があることです。

 var random = new Random(); 
     HashSet<int> containerSet = new HashSet<int>(); 
     do 
     { 
      containerSet.Add(random.Next(1, 80)); 

     } while (containerSet.Count < 20); 

     var position = 0; 
     var containerList = containerSet.ToList(); 
     foreach (TextBox c in panel1.Controls) 
     { 
      c.Text = containerList[position++]; 
     }