どうも、ちょげ(@chogetarou)です。
配列(Array)をシャッフルする方法を紹介します。
方法

配列(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クラスを使う方法
コメント