[C#]配列(Array)をシャッフルするには?

C#

どうも、ちょげ(@chogetarou)です。

配列(Array)をシャッフルする方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

配列(Array)をシャッフルする方法は、2つあります。

Randomクラス

1つは、Randomクラスを使う方法です。

まず、System.Linqを導入します。

using System.Linq;

次に、Randomクラスのインスタンスを用意します。

Random rnd = new Random();

そして、配列(Array)からOrderBy()を呼び出します。

OrderBy()の引数のラムダ式で、RandomクラスのインスタンスからNext()を呼び出します。

最後に、OrderBy()からToArray()を呼び出します。

T[] result = array.OrderBy(x => rnd.Next()).ToArray();

上記のOrderBy().ToArray()は、OrderBy()を呼び出した配列をシャッフルした新しい配列を返します。

使用例

using System;
using System.Linq;
public class Example
{
	public static void Main()
	{
		int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
		
		Random rnd = new Random();
		
		int[] result = numbers.OrderBy(x => rnd.Next()).ToArray();
		
		foreach (var i in result) 
		{
		    Console.WriteLine(i);    
		}
 	}
}

RNGCryptoServiceProviderクラス

もう1つは、RNGCryptoServiceProviderクラスを使う方法です。

まず、System.LinqとSystem.Security.Cryptographyを導入します。

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

次に、以下のような関数を用意します。

static int GetNext(RNGCryptoServiceProvider random)
   {
            byte[] randomInt = new byte[4];
            random.GetBytes(randomInt);
            return Convert.ToInt32(randomInt[0]);
    }

RNGCryptoServiceProviderクラスのインスタンスを用意します。

RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();

そして、配列(Array)からOrderBy()を呼び出します。

OrderBy()の引数のラムダ式で、用意した関数を呼び出します。

関数の引数にRNGCryptoServiceProviderクラスのインスタンスを指定します。

最後に、OrderBy()からToArray()を呼び出します。

T[] result = array.OrderBy(x => GetNext(random)).ToArray();

上記のOrderBy().ToArray()は、OrderBy()を呼び出した配列をシャッフルした新しい配列を返します。

使用例

using System;
using System.Linq;
using System.Security.Cryptography;
public class Example
{
    static int GetNext(RNGCryptoServiceProvider random)
    {
            byte[] randomInt = new byte[4];
            random.GetBytes(randomInt);
            return Convert.ToInt32(randomInt[0]);
    }
    
	public static void Main()
	{
		int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
		
		RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();
		
		int[] result = numbers.OrderBy(x => GetNext(random)).ToArray();
		
		foreach (var i in result) 
		{
		    Console.WriteLine(i);    
		}
 	}
}
スポンサーリンク

まとめ

配列(array)をシャッフルする方法は、次の2つです。

  • Random()クラスを使う方法
  • RNGCryptoServiceProviderクラスを使う方法

コメント

タイトルとURLをコピーしました