小波です。 Hiroyuki Adachi wrote: > array = [1, 2, 3, 4, 5] > array.each_index do |idx| > jdx = rand(idx + 1) > array[idx], array[jdx] = array[jdx], array[idx] > end > p array #=> [1, 4, 5, 2, 3] どうもありがとうございます。 idx と jdx は,最初どちらも 0 なので,最初のスワップは無駄をやっているみ たいですね。発想としては,もろに頭から要素をスワップしていくやりかたで, 本当にランダムにシャッフルできるかどうかが気になったので,多数回繰り返さ せて,得られた統計データをΧ2乗検定してみました。大丈夫みたい。以下は 検定に使ったソースです。検定はパスしました(^^) #!/usr/local/bin/ruby ca = [] nt = 100 n = 3000 e = n/6.0 for j in 0 ... 100 c = [0,0,0,0,0,0] for i in 0 ... n array = ["1","2","3"] array.each_index do |idx| jdx = rand(idx + 1) array[idx], array[jdx] = array[jdx], array[idx] end c[0] += 1 if array == ["1","2","3"] c[1] += 1 if array == ["1","3","2"] c[2] += 1 if array == ["2","1","3"] c[3] += 1 if array == ["2","3","1"] c[4] += 1 if array == ["3","1","2"] c[5] += 1 if array == ["3","2","1"] end chi2 = 0.0 for x in c chi2 += (x-e)**2/e end ca << chi2 end ca.sort! median = (ca[nt/2-1] + ca[nt/2])/2 puts median # この値が自由度5のΧ2乗分布の50%点に一致していればよい。 # => 4.351 (大体これくらいが理想)