def shuffle arr
shuffled = []
while arr.length > 0
randNum = rand(arr.length)
idx = 0
unshuf = []
print '--- arr='; p arr # <--------
arr.each do |item|
if idx == randNum
shuffled.push item
else
unshuf.push item
end
print 'shuffled='; print shuffled; print ', unshuf='; p unshuf # <--------
idx = idx + 1
end
arr = unshuf
end
return shuffled
end
p shuffle([ 11, 12, 13, 14, 15])
実行:
$ ruby -w t.rb
--- arr=[11, 12, 13, 14, 15]
shuffled=[], unshuf=[11]
shuffled=[], unshuf=[11, 12]
shuffled=[13], unshuf=[11, 12]
shuffled=[13], unshuf=[11, 12, 14]
shuffled=[13], unshuf=[11, 12, 14, 15]
--- arr=[11, 12, 14, 15]
shuffled=[13, 11], unshuf=[]
shuffled=[13, 11], unshuf=[12]
shuffled=[13, 11], unshuf=[12, 14]
shuffled=[13, 11], unshuf=[12, 14, 15]
--- arr=[12, 14, 15]
shuffled=[13, 11, 12], unshuf=[]
shuffled=[13, 11, 12], unshuf=[14]
shuffled=[13, 11, 12], unshuf=[14, 15]
--- arr=[14, 15]
shuffled=[13, 11, 12, 14], unshuf=[]
shuffled=[13, 11, 12, 14], unshuf=[15]
--- arr=[15]
shuffled=[13, 11, 12, 14, 15], unshuf=[]
[13, 11, 12, 14, 15]
説明:のコンテンツは、シャッフルされたものarr
とシャッフルされていないものの間でランダムに分散されます。次に、unshufがarrに置き換わり、unshufに何かがあった場合、whileループはシャッフルで少し、unshufで少しランダムに再配布されます。unshufが空になるまで続けます。したがって、シャッフルされた要素は、メソッドにarr
最初に指定されたパラメーターからランダムに取得された要素で徐々に埋められますが、シャッフルされていない要素のみをに保持することによって徐々に空になります。もちろん、arrに移動した後、新しいディストリビューションを受信するには、unshufを空の配列にリセットする必要がありますが、シャッフルは成長し続ける必要があります。それが明確であることを願っています。shuffle
arr
arr = unshuf