並べ換え(sort)や、シャッフルの操作をするときに必須となってくるのが データの交換操作である。もっとも簡単な例として
x = 10 y = 20
となっているときに、x
とy
の値を交換する
プログラムを考えよう。単純に考えて、
x = y y = x
としたら、これはうまくいかない。なぜなら、1行目のx=y
により、すぐにx
の値がy(20)
になってしまい、
それまでx
の持っていた10という値は消えてしまう。
このような場合は、作業用変数を作って、一度片方の値を保存してから入れ 換え作業をする必要がある。
w = x # wが作業用変数 x = y y = w # wには以前のxの値が残っている
これをふまえて、配列(あるいはハッシュ)に保存されている
i
番目要素と、j
番目要素を交換するプログラムは
次のようになる。
# arrが配列。arr[i] と arr[j] の値を交換する w = arr[i] arr[i] = arr[j] arr[j] = w
配列の要素をでたらめな順番に並べ換える(シャッフルする)には
乱数を生成する rand
メソッドを利用し、ランダムな位置にある
要素と値を交換して行けばよい。
「ランダムな位置」は、配列の要素を超えてはならないから、
rand
メソッドに上限となる整数を指定する。
rand
(自然数)0〜自然数-1 の範囲の整数の擬似乱数を生成する。
srand
乱数の種を初期化する。乱数を利用する前にこれを呼ぶことで 起動する度に違う乱数が得られる。
配列の添字を超えない乱数は rand(配列.length)
によって生成できる。
以上の知識をふまえて、配列にある要素をシャッフルするメソッドは以下の ように書ける。
def shuffle(a) srand 0.upto(a.length-1) do |i| j = rand(a.length) # 交換相手をランダムに選ぶ w = a[i] a[i] = a[j] a[j] = w end a end