小波です。

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 (大体これくらいが理想)