3. 考え方
配列の並べ替えなので、結局は配列要素をスワップする
{どうやって|何回}並べ替えるのかが、考えるポイント
配列の取り得るパターン数は、順列数え上げなので、
N 個の配列だとすると N PN = N! 個
irandom(i,j) という関数は、
i 以上 j 以下のランダムな整数を返すものとする
iramdom(1,N) を行って、1 以上 N 以下の値 r 1 を得る
最初は配列要素の位置と値が同じはずなので、
1番目の要素と r 1 番目の要素を入れ替えることによって、
1番目の要素をランダムな値にする
1番目の要素が選ばれるパターンは、N 通り
irandom(2,N) を行って、2 以上 N 以下の値 r 2 を得る
2番目の要素と r 2 番目の要素を入れ替えることによって、
2番目の要素を(1番目の値以外の)ランダムな値にする
2番目の要素が選ばれるパターンは、N − 1 通り
3/5
4. 考え方(続き)
このやり方を N − 1 回繰り返す
N − 1 回目は、irandom(N-1,N) なので、
N − 1 番目と N 番目を入れ替えるか否かの2択
N 回目は、もうひとつしか残っていないので、やる必要なし
すると、ランダムに選んだ方法のパターン数も、N! 通り
配列のパターン数と同じだけ、ランダムに並べ替えられる
4/5
5. Lua で実装
Lua で実装してみる
random shuffle.lua
num = 10
math.randomseed(os.time())
a = {}
for i = 1, num, 1 do a[i] = i end
for i = 1, num - 1, 1 do
r = math.random(i, num)
if (i < r) then a[i], a[r] = a[r], a[i] end
end
for i = 1, num, 1 do print(a[i]) end
Lua にはお誂え向きの random も swap もある!
ほとんどワンライナーじゃないか!
5/5