【C#】配列のシャッフル

複数のデータが代入されている配列の要素をシャッフルするサンプルコードになります
シャッフルのアルゴリズム(考え方)は、Fisher-Yatesを使っています

元の配列自体が変更されます

// 整数配列を初期化
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// シャッフル前の配列を表示
Console.WriteLine("シャッフル前:");
foreach (int number in numbers)
{
    Console.Write(number + " ");
}
Console.WriteLine();

// 配列をシャッフル
ShuffleArray(numbers);

// シャッフル後の配列を表示
Console.WriteLine("シャッフル後:");
foreach (int number in numbers)
{
    Console.Write(number + " ");
}
Console.WriteLine();

int[] ShuffleArray(int[] array)
{
    Random random = new Random();

    int n = array.Length;
    for (int i = 0; i < n; i++)
    {
        // Fisher-Yates shuffle の実装
        int r = i + random.Next(n - i);
        int temp = array[i];
        array[i] = array[r];
        array[r] = temp;
    }
    return array;
}

このサンプルコードは、次のように動作します:

  1. numbersという名前の整数配列を定義し、1から10までの整数で初期化します。
  2. ShuffleArrayメソッドを呼び出す前に、シャッフル前の配列の内容をコンソールに出力します。
  3. ShuffleArrayメソッドを呼び出して配列をシャッフルします。このメソッドは、配列内の要素をランダムに並び替えます。
  4. 最後に、シャッフル後の配列の内容をコンソールに出力します。

このサンプルを実行すると、配列の要素がランダムに並び替えられた結果がコンソールに表示されます。ShuffleArrayメソッドの呼び出しによって配列の要素がインプレース(元の配列内で)シャッフルされることがわかります。

元の配列自体は変更されず、新しい配列が取得できます

// 整数配列を初期化
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// シャッフル前の配列を表示
Console.WriteLine("シャッフル前:");
foreach (int number in numbers)
{
    Console.Write(number + " ");
}
Console.WriteLine();

// 配列をシャッフル(元の配列は変更されない)
int[] shuffledNumbers = ShuffleArrayWithoutChangingOriginal(numbers);

// シャッフル後の配列を表示
Console.WriteLine("シャッフル後 (元の配列は変更されない):");
foreach (int number in shuffledNumbers)
{
    Console.Write(number + " ");
}
Console.WriteLine();

// 元の配列を再表示して、変更されていないことを確認
Console.WriteLine("シャッフル後での元の配列:");
foreach (int number in numbers)
{
    Console.Write(number + " ");
}
Console.WriteLine();

int[] ShuffleArrayWithoutChangingOriginal(int[] array)
{
    Random random = new Random();
    int[] arrayCopy = (int[])array.Clone(); // 配列のコピーを作成

    int n = arrayCopy.Length;
    for (int i = 0; i < n; i++)
    {
        // Fisher-Yates shuffle の実装でコピーをシャッフル
        int r = i + random.Next(n - i);
        int temp = arrayCopy[i];
        arrayCopy[i] = arrayCopy[r];
        arrayCopy[r] = temp;
    }
    return arrayCopy;
}

ShuffleArrayWithoutChangingOriginalメソッドは以下の動作をします:

  1. 引数で渡された配列のコピーを作成します。これには.Clone()メソッドを使用し、型キャストを(int[])で行います。これにより、元の配列は変更されずにそのまま残ります。
  2. 作成したコピーに対してFisher-Yatesシャッフルを実施します。このプロセスではコピーの内容が変更されますが、元の配列は影響を受けません。
  3. シャッフルされたコピーを戻り値として返します。

最後に、メインメソッド内で元の配列とシャッフルされた配列の両方を表示し、元の配列がシャッフル操作によって変更されていないことを確認します。これにより、元のデータを保持しつつ、そのシャッフルされたバージョンを利用できるようになります。

C#

Posted by hidepon