ランダムにn個

配列からn個の要素を重複無しでランダムに取り出す - m2
後の二つ三つ目は一様にならないし,重複する可能性もあるような。

function shuffle(a, n){ // Fisher-Yates
  var r = a.concat(), l = r.length, n = n < l ? n : l, i = l, j, t;
  for(i = l; i;) t = r[j = Math.random()*i--|0], r[j] = r[i], r[i] = t;
  r.length = n;
  return r;
}

証明済みのアルゴリズムで愚直にやるとこうなるけど,n と a.length の差が大きいときに損するか。

+

勘違いに気付いてみると,元ネタの二つ目はまさに損しないやり方。自分--。