2012-11-06 2 views
1

나는확장 메서드를 구현하는 방법 반환없이 목록의 역방향처럼 셔플? <pre><code>list = list.Shuffle(); </code></pre> <p></p> 내가 너무 기본적으로</p> <pre><code>list.Shuffle(); // like list.Reverse(); </code></pre> <p>처럼 사용할 수 있도록하려면,

public static IList<T> Shuffle<T>(this IList<T> list) 
    { 
     var rnd = new Random(); 
     return list.OrderBy(element => rnd.Next()); 
    } 

지금까지 셔플에 대한 다음과 같은 코드를 가지고 내가 좋아하는 그것을 사용 참조로 셔플하고 싶습니다

다음의 공동 작업을 시도했습니다. de,

public static void Shuffle<T>(this ref IList<T> list) 
    { 
     var rnd = new Random(); 
     list.OrderBy(element => rnd.Next()); 
    } 

그러나 작동하지 않습니다.

도움을 주시면 대단히 감사하겠습니다.

답변

5

나는 꽤 오래 전에이 책을 썼다. 링크 된 알고리즘에 대해 사실인지 확인할 가치가 있습니다. 이런 종류의 일은 미묘하게 잘못되기 쉽다는 것이 악명이 높습니다. 아래의 코멘트를 같이

//Fisher-Yates_shuffle http://en.wikipedia.org/wiki/Fisher-Yates_shuffle 
    private static readonly ThreadLocal<Random> RandomThreadLocal = 
     new ThreadLocal<Random>(() => new Random()); 
    public static void Shuffle<T>(this IList<T> list, int seed = -1) 
    { 
     var r = seed >= 0 ? new Random(seed) : RandomThreadLocal.Value; 
     var len = list.Count; 
     for (var i = len - 1; i >= 1; --i) 
     { 
      var j = r.Next(i); 
      var tmp = list[i]; 
      list[i] = list[j]; 
      list[j] = tmp; 
     } 
    } 

은 더 많은 유연성 과부하 수 :

private static readonly ThreadLocal<Random> RandomThreadLocal = 
     new ThreadLocal<Random>(() => new Random()); 
    public static void Shuffle<T>(this IList<T> list, int seed) 
    { 
     list.Shuffle(new Random(seed)); 
    } 

    public static void Shuffle<T>(this IList<T> list) 
    { 
     list.Shuffle(null); 
    } 

    public static void Shuffle<T>(this IList<T> list, Random rand) 
    { 
     var r = rand ?? RandomThreadLocal.Value; 

     var len = list.Count; 
     for (var i = len - 1; i >= 1; --i) 
     { 
      var j = r.Next(i); 
      var tmp = list[i]; 
      list[i] = list[j]; 
      list[j] = tmp; 
     } 
    } 
+1

나는 또한 기존의'Random' 인스턴스에 전달 (아마도 다른 사람 이외에) 과부하를 제공하고있다. – Servy

+1

좋은 생각. 내놔, 몇 분! – spender

+0

고마워요 :) –