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

Muhammad Maisam Abbas 2024年2月16日
  1. C# の Random クラスで配列をシャッフルする
  2. C# の RNGCryptoServiceProvider クラスで配列をシャッフルする
C# で配列をシャッフルする

このチュートリアルでは、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() を定義しました。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

関連記事 - Csharp Array