2017-01-15 5 views
0

반복없이 목록에 임의 번호를 넣을 수 있습니까? 다음은 때때로 숫자가 반복되는 내 코드입니다하지만반복하지 않고 Foreach 목록 검색

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 사이의 숫자가 생성됩니다. 고유 한 것은 아닙니다. 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>을 반환합니다.

OrderBy(x => rnd.Next())은 값을 임의의 순서로 정렬합니다.

Take(10)IEnumerable<int>에서

마지막으로 ToList()이 값을 int로 목록을 반환됩니다 처음 10 개 번호를 반환합니다.