配列のシャッフル
- シャッフル ( C# と VB.NET の質問掲示板)
- かき混ぜてはいかがでしょうか (東方算程譚)
επιστημηさんの解法が目から鱗モノでした。
なるほど、シャッフルってこうやれば綺麗に書けるんですね。すごく勉強になりました。
って事で、より理解を深めるために、自分なりに C# コードに落としてみる試み♪
static class ListExtension { public static void Shuffle(this List<int> list) { var rnd = new Random(); Enumerable.Range(1, list.Count).Reverse().ToList().ForEach(i => list.Swap(rnd.Next(i), i - 1)); } public static void Swap(this List<int> list, int index1, int index2) { var a = list[index1]; list[index1] = list[index2]; list[index2] = a; } } class ShuffleDemo { static void Main() { var list = Enumerable.Range(1, 13).ToList(); Console.WriteLine("シャッフル前"); list.ForEach(i => Console.Write("{0} ", i)); Console.WriteLine(); list.Shuffle(); Console.WriteLine("シャッフル後"); list.ForEach(i => Console.Write("{0} ", i)); } }