PowerShell: 配列をシャッフルする Get-Random

PowerShellで配列をシャッフルしたい場合は、 Get-Randomコマンドレットを使うと簡単に実現できます。 Get-Randomは乱数を取得する時にも使えますし、 配列等のオブジェクトからランダムに要素を取得したい場合にも使用できます。
(関連記事: 乱数を取得する Get-Random

Get-Randomの書式は次の通りです。

書式
Get-Random オブジェクト [-Count 取得数]

オブジェクトに配列を指定した場合、 配列の要素を「ランダムにダブルことなく」取得できます。 この機能を応用して配列のシャッフルを行います。 シャッフルする場合は「取得数」に配列の要素数を指定します。 (仮に要素数以上の数を指定しても要素数しか返ってきません)

例えば配列$arrをシャッフルしたい場合は次のように記述します。

Get-Random $arr -Count $arr.Length

シャッフルしてみる

Get-Randomを使って配列のシャッフルを行い、 結果に偏りがないかをチェックしてみます。
用意する配列は1から10までの数値が入った配列$arrです。 これを15回シャッフルして、結果を表示します。

$arr = 1..10

for ($i = 0; $i -lt 15; $i++) {

	$arr2 = Get-Random $arr -Count $arr.Length

	Write-Host $arr2
}

シャッフルを行っているのは以下の部分です。

$arr2 = Get-Random $arr -Count $arr.Length

上のコードはは次のように配列をパイプで渡しても結果は同じです。

$arr2 = $arr | Get-Random -Count $arr.Length

実行結果は次の通りです。 特に偏りは見られずに、 ランダムにシャッフルされています。

1 7 4 9 2 6 5 3 8 10
4 8 6 10 1 2 9 3 7 5
9 4 1 8 6 10 5 7 3 2
8 1 2 9 6 4 7 5 3 10
6 4 3 7 9 1 10 8 5 2
8 1 5 10 6 2 7 4 3 9
8 2 4 5 7 6 10 1 9 3
6 10 3 1 2 5 8 7 9 4
1 6 7 3 10 4 9 5 8 2
9 2 10 4 6 8 1 5 3 7
8 6 7 10 9 2 3 1 4 5
10 2 7 5 9 3 8 1 6 4
4 8 3 5 10 7 6 2 1 9
2 10 5 7 6 8 9 1 4 3
9 6 3 8 10 5 7 1 4 2

(まとめ記事: PowerShell 配列

PowerShell