2013-09-02 3 views
-2

C#에서는 1에서 5까지 고유 한 값을 포함해야하는 5 개의 난수 목록을 원합니다. 어떻게하면 될까요? 예를 들어고유해야하는 난수 목록을 얻는 방법

: 1,3,2,5,4 또는

목록에 반드시 5

1에서 숫자를 가지고해야한다 (5 개) 임의의 숫자를 포함, 즉 2,5,1,3,4
+3

임의의 값 = 무작위 섞인 고유 한 값 – Corak

+0

참고 : http://ericlippert.com/2013/04/15/producing-permutations-part-one/ –

+0

시도해 보셨습니까? 어떤 연구를 했습니까? 이 질문의 내용은 '아니오'를 의미합니다. –

답변

3

필요한 것은 shuffling입니다. 내가 연결 한 피셔 - 예이츠 셔플은 선형 시간에 그렇게 할 수있게 해줍니다. 그게 최선의 결과입니다.

는 C#에서 그렇게하려면, 당신도 확장 메서드를 구현할 수 있습니다, 그것은 다음과 같이 표시됩니다

public static Random rand = new Random(); 
    public static List<T> Shuffle<T>(this List<T> original) 
    { 
     List<T> lst = new List<T>(original); 
     for (int i = lst.Count - 1; i >= 0; i--) 
     { 
      int j = rand.Next(0, i + 1); 
      T tmp = lst[j]; 
      lst[j] = lst[i]; 
      lst[i] = tmp; 
     } 
     return lst; 
    } 

하고 그것을 호출!

var shuffled = lst.Shuffle(); 
+0

'rand.Next (0, i + 1)'은 첫 번째 루프 인 경우'i + 1'을 생성 할 수 있으며 이는'j = lst.Count'를 의미하고'lst [j]'는'ArgumentOutOfRangeException'을 던집니다 ? –

+0

@KingKing 아니요. 두 번째 인수는 * exclusive *입니다. –

+0

@KingKin "maxValue : 반환 된 난수의 배타적 인 상한값입니다." 두 번째 인수가 배타적이기 때문에 첫 번째 인수가 포함되어 있기 때문에 그렇지 않습니다. – Save

4
Random rnd = new Random(); 
var list = Enumerable.Range(1, 5).OrderBy(x => rnd.Next()).ToList();