[C#] 配列をランダムソート(シャッフル)する方法

[C#] 配列をランダムソート(シャッフル)する方法

ランダムな配列

[C#] 連番配列と全要素同値の配列の初期化方法

上記リンク先で配列の生成方法についてまとめています。今回は配列をランダムな順に並び替える(つまりシャッフルする)方法をまとめます。配列を扱っていますが、実際はコレクション要素(Listなど)であれば同様に処理できます。

配列のランダムソート(シャッフル)

任意の配列について、ランダムな順にソートする方法です。

// シャッフルするもとの配列
int[] ary1 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// ランダムな順にソートされた配列
int[] ary2 = ary1.OrderBy(i => Guid.NewGuid()).ToArray();

ソート処理自体は、OrderBy メソッドを使用します。ソートのキーには、GUIDを生成して使用します。

GUID値を生成するには?[C#、VB]

GUIDとは、128ビットの整数値からなる、データを一意に識別するために用いられる識別子のことです。GUIDが重複することは実用上ほぼありません。このGUIDをキーとしてソートすることでランダムな並び順になります。

拡張メソッド

ランダムソートをよく使用するのであれば、OrderBy メソッドを何度も書くのは手間なので、拡張メソッドで呼び出せるようにしておくと便利です。以下の例では、拡張メソッド Shuffle を定義しています。

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        //シャッフルする配列
        int[] ary1 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        //シャッフルする
        int[] ary2 = ary1.Shuffle().ToArray();

        // 結果表示
        Console.WriteLine(string.Join(", ", ary2));
    }
}

// IEnumerable に拡張メソッド定義
public static class IEnumerableExtension
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> collection)
    {
        return collection.OrderBy(i => Guid.NewGuid());
    }
}

参考URL

C#カテゴリの最新記事