んー、なんでreverseが入るのかがわからなかった
reverseするのではなく、
通常 切った片方 下の部分を更に分割して下の部分を上にのせる
この処理をすっかり忘れていました^^;

ですが、再起の頭がすっかり駄目になった気がする^^;
とりあえず、こんな感じでしょうか


def shuffle1(a)
  if a.size > 3 then
    x = rand(a.size-1)
    b = a.slice!(0..x)
    a = shuffle1(a)
  else
    return a
  end
  return a+b
end

def shuffle(a, time=1)
  time.times{
    a = shuffle1(a)
  }
  return a
end

array = ("a".."p").to_a
p shuffle(array, 5)