2017-01-15 4 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

Каждый раз, когда вы вызываете 'Next', он генерирует число от 1 до 20. Они не гарантированно уникальны. Вы могли бы взглянуть на перетасовку Фишера-Йейтса и пойти на это. 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) возвратит первые 10 номеров из IEnumerable<int>,

и, наконец, ToList() возвращает список этих значений Int.

Смежные вопросы