C# で配列をシャッフルする

  1. C# の Random クラスで配列をシャッフルする
  2. C# の RNGCryptoServiceProvider クラスで配列をシャッフルする

このチュートリアルでは、C# で配列をシャッフルする方法について説明します。

C# の Random クラスで配列をシャッフルする

Random クラスは C# で乱数を生成します。Random.Next() メソッドはランダムな整数値を生成します。LINQ で Random.Next() メソッドを使用して、C# で配列をシャッフルできます。

using System;
using System.Linq;
using System.Security.Cryptography;

namespace randomize_array
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1, 2, 3, 4, 5 };
            Random random = new Random();
            arr = arr.OrderBy(x => random.Next()).ToArray();
            foreach (var i in arr)
            {
                Console.WriteLine(i);
            }
        }
    }
}

出力:

3
4
5
1
2

上記のコードでは、整数の配列 arrRandom.Next() メソッドと C# の LINQ でシャッフルしました。まず、Random.Next() メソッドを使用してランダムインデックスを生成し、OrderBy() メソッドを使用して各要素をランダムインデックスに配置しました。次に、結果のデータ構造を ToArray() メソッドを使用して配列に変換しました。

C# の RNGCryptoServiceProvider クラスで配列をシャッフルする

C# の RNGCryptoServiceProvider クラスは乱数を生成します。RNGCryptoServiceProvider クラスは Random クラスよりもランダムであるため、このメソッドは以前のアプローチよりも信頼性が高くなります。RNGCryptoServiceProvider クラスは主に暗号化に使用されるため、Random クラスよりも安全です。RNGCryptoServiceProvider クラスの GetBytes() メソッドは、バイトの配列をランダムな値のシーケンスで埋めるために使用されます。Convert.ToInt32() メソッドを使用して、このランダムなバイト値を整数に変換できます。次に、このランダムな整数を各要素のインデックスとして使用できます。次のコード例は、C# で RNGCryptoServiceProvider クラスを使用して配列をシャッフルする方法を示しています。

using System;
using System.Linq;
using System.Security.Cryptography;

namespace randomize_array
{
    class Program
    {
        static int Next(RNGCryptoServiceProvider random)
        {
            byte[] randomInt = new byte[4];
            random.GetBytes(randomInt);
            return Convert.ToInt32(randomInt[0]);
        }
        static void Main(string[] args)
        {
            int[] arr = { 1, 2, 3, 4, 5 };
            RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();
            arr = arr.OrderBy(x => Next(random)).ToArray();
            foreach (var i in arr)
            {
                Console.WriteLine(i);
            }
        }
    }
}

出力:

5
1
2
4
3

この例で従うロジックは、前のアプローチと同じです。違いは、ここでは RNGCryptoServiceProvider クラスを使用して配列のランダムインデックスを生成していることです。RNGCryptoServiceProvider クラスを使用してランダム整数インデックスを生成するメソッド Next() を定義しました。

関連記事 - Csharp Array

  • C# で配列の長さを取得する
  • C# で配列を並べ替える
  • C# で配列を降順で並べ替える
  • C# で文字列をバイト配列に変換する方法