コード
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 クラスは、一意性はある程度期待できると書かれているものの、ランダム性は特に言及されていない。
出現にパターンがある可能性もあるし、厳密にランダムである必要がある場合は、使わない方がいいかもしれない。
続きを読む →