シャッフルっつうか、ようはリストからランダムにいくつかピックアップしたかったんです。Javascriptで。
5個から3個選ぶ場合、Perlなら
@list = (1, 2, 3, 4, 5);
for (0 .. 2) {
$index = int(rand($#list));
push(@selected, $list[index]);
splice(@list, $index, 1);
}
ってやるんですけど(ひさびさに書いたんで間違ってるかも)、Javascriptだとどうやるんだろうと。
悩んだ挙句、下のようにやってました。
var list = new Array(1, 2, 3, 4, 5);
for (i = 0; i < 5; i++) {
var index = Math.floor(Math.random()*list.length);
swap(list, i, index);
}
var selected = list.slice(0, 3);
function swap(target, index_a, index_b) {
b = target[index_b];
target[index_b] = target[index_a];
target[index_a] = b;
}
これでまあ、selectedにはランダムっぽいのが入ってくるんで一瞬満足してたんですが、よく考えたら等確率になってない。
listが3つくらいのときを考えれば簡単だけど、例えば1~3の数字からランダムに選んで
selected = [1, 2, 3]
になる確率は1/6だけど上記の方法で
list = [1, 2, 3] ⇒ selected = [1, 2, 3]
になる確率は4/27だ。
というわけでどうしたもんか、めんどくさいなーと思っていたら、Javascriptにもspliceあるじゃないか!(いつのバージョンからあるのかは知らんけど)
そういうわけで下記のように変更しました。
var list = new Array(1, 2, 3, 4, 5);
var selected = new Array(3);
for (i = 0; i < 3; i++) {
selected[i] = list.splice(Math.floor(Math.random()*list.length), 1);
}
以上
Hi webmaster!
Hi webmaster!