2017-01-15 2 views
0

どのように反復することなくリストにランダム化することができますか? は、ここで時々番号が繰り返され、私のコードですが、あなたは、この数が以前に生成されたかどうかを確認し、それが繰り返される場合は、別の番号を生成する必要がありますなぜ繰り返しのないリストの検索

Random losowa = new Random(); 
List<int> pula = new List<int>(); 

private void LosujPytania() 
{    
    int a = losowa.Next(1,20); 
    while (pula.Count < 10) 
    { 
     foreach (int i in pula) 
     { 
      if (a == i) 
      { 
       a = losowa.Next(1, 20); 
       break; 
      } 

     } 
     pula.Add(a); 
    } 
} 
+1

「次へ」を呼び出すたびに、1から20までの数字が生成されます。これらは一意ではありません。あなたはFisher-Yatesのシャッフルを見て、それを実行することができます。 https://www.dotnetperls.com/fisher-yates-shuffle –

答えて

0

私は知りません。このことにより、

private void LosujPytania() 
{    
    int a = losowa.Next(1,20); 
    while (pula.Count < 10) 
    { 
     foreach (int i in pula) 
     { 
      if (a == i) 
      { 
       a = losowa.Next(1, 20); 
       break; 
      } 
     } 
     pula.Add(a); 
    } 
} 

private void LosujPytania() 
{    
    int a = losowa.Next(1,20); 
    pula.Add(a); 
    while (pula.Count < 10) 
    { 
     do 
     { 
      a = losowa.Next(1, 20); 
     } while(pula.Contains(a)); 

     pula.Add(a); 
    } 
} 
1

以下のコードは、繰り返しなし番号のリストを作成し、この

変更。問題を解決するための鍵は、list.Contains()です。

using System; 
    using System.Collections.Generic; 

    public class Program 
    { 
     public static void Main() 
     { 
      var list = new List<int>();    
      var rand = new Random(); 

      while(list.Count <10) 
      { 
       var number = rand.Next(1,20); 

       if(! list.Contains(number)) 
        list.Add(number);    
      } 

      foreach(var item in list)   
       Console.WriteLine(item); 
     } 
    } 
0

あなたがこれを行うことができ、あなたは私のコメントの追加詳細情報を確認できます。

private static void LosujPytania() 
      {   

     Random losowa = new Random(); 
     List<int> pula = new List<int>(); 

       int a = losowa.Next(1,20); 
       while (pula.Count < 10) 
       { 
        //Your code is not really checking for duplicates so I replace it with boolean condition below 
        //foreach (int i in pula) 
        //{ 
        // if (a == i) 
        // { 
        //  a = losowa.Next(1, 20); 
        //  break; 
        // } 

        //} 

        a = losowa.Next(1, 20); 
        //This will check if your list doesn't contain your numbers yet before adding to make sure everything is unique 
        if (!pula.Contains(a)) 
        pula.Add(a); 
       } 
     } 
0

あなたは複製せずに数字、 をしたい場合、私はHashSetのを使用する方がよいと思います。

  Random losowa = new Random(); 
      HashSet<int> pula = new HashSet<int>(); 
      while (pula.Count < 10) 
      { 
       pula.Add(r.Next(20)); 
      } 

またはあなたが本当にリストが必要な場合は、次のような 何かヘルパーメソッドを使用することができます。

private void LosujPytania() 
    { 
     Random losowa = new Random(); 
     List<int> pula = new List<int>(); 
     int a = losowa.Next(1, 20); 
     pula.AddRange(Get10RandomNumbers(losowa)); 
    } 

    private IEnumerable<int> Get10RandomNumbers(Random losowa) 
    { 
     HashSet<int> ints = new HashSet<int>(); 
     while (ints.Count < 10) 
     { 
      ints.Add(losowa.Next(20)); 
     } 
     return ints; 

    } 
0

、単純な2つのラインのソリューション:

var rnd = new Random(); 
var list = Enumerable.Range(0, 20).OrderBy(x => rnd.Next()).Take(10).ToList(); 

説明:

Enumerable.Range(0, 20)IEnumerable<int>を返します数字は0から19までです。

OrderBy(x => rnd.Next())は、値をランダムな順序にソートします。

Take(10)は、IEnumerable<int>から最初の10個の数字を返す

そして最後に、ToList()は、これらのint型の値のリストを返しますされます。

関連する問題