コード
PowerShell で 極力簡単に配列をシャッフル (ランダムにソート) する方法。
速度や制度などはガン無視して、簡単に書けることを重視。
$shuffled = $array | sort -prop @{Exp={[Guid]::NewGuid()}}
ハイ終わり。
検証
ホントに実用的なシャッフルになっているか心配なので、実際に 0~19 のシャッフルを 2000 回行って、先頭に来た数字と、10 が来たインデックスを集計してみる。
$r = 0..1999
$r | %{ $r[$_] = 0..19 | sort -prop @{Exp={[Guid]::NewGuid()}}; }
$r | %{ $_[0] } | group | Format-Table -AutoSize
$r | %{ $_.IndexOf(10) } | group | Format-Table -AutoSize
Count Name Group ----- ---- ----- 104 16 {16, 16, 16, 16...} 91 19 {19, 19, 19, 19...} 111 8 {8, 8, 8, 8...} 102 7 {7, 7, 7, 7...} 95 18 {18, 18, 18, 18...} 105 3 {3, 3, 3, 3...} 95 12 {12, 12, 12, 12...} 83 15 {15, 15, 15, 15...} 100 17 {17, 17, 17, 17...} 89 5 {5, 5, 5, 5...} 103 13 {13, 13, 13, 13...} 103 11 {11, 11, 11, 11...} 101 10 {10, 10, 10, 10...} 110 4 {4, 4, 4, 4...} 100 6 {6, 6, 6, 6...} 88 2 {2, 2, 2, 2...} 123 9 {9, 9, 9, 9...} 92 1 {1, 1, 1, 1...} 107 0 {0, 0, 0, 0...} 98 14 {14, 14, 14, 14...} Count Name Group ----- ---- ----- 102 17 {17, 17, 17, 17...} 93 15 {15, 15, 15, 15...} 100 9 {9, 9, 9, 9...} 109 18 {18, 18, 18, 18...} 91 4 {4, 4, 4, 4...} 104 5 {5, 5, 5, 5...} 111 3 {3, 3, 3, 3...} 107 7 {7, 7, 7, 7...} 83 1 {1, 1, 1, 1...} 106 10 {10, 10, 10, 10...} 101 13 {13, 13, 13, 13...} 93 8 {8, 8, 8, 8...} 111 16 {16, 16, 16, 16...} 101 0 {0, 0, 0, 0...} 83 2 {2, 2, 2, 2...} 104 14 {14, 14, 14, 14...} 103 12 {12, 12, 12, 12...} 98 11 {11, 11, 11, 11...} 81 19 {19, 19, 19, 19...} 119 6 {6, 6, 6, 6...}
だいたい 100 に収束しているし、問題ないんじゃない?
とはいえ、 Guid クラスは、一意性はある程度期待できると書かれているものの、ランダム性は特に言及されていない。
出現にパターンがある可能性もあるし、厳密にランダムである必要がある場合は、使わない方がいいかもしれない。