나는 꽤 오래 전에이 책을 썼다. 링크 된 알고리즘에 대해 사실인지 확인할 가치가 있습니다. 이런 종류의 일은 미묘하게 잘못되기 쉽다는 것이 악명이 높습니다. 아래의 코멘트를 같이
//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;
}
}
나는 또한 기존의'Random' 인스턴스에 전달 (아마도 다른 사람 이외에) 과부하를 제공하고있다. – Servy
좋은 생각. 내놔, 몇 분! – spender
고마워요 :) –