Home > Javascript > シャッフルシャッフル!

シャッフルシャッフル!

シャッフルっつうか、ようはリストからランダムにいくつかピックアップしたかったんです。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);
}

以上

Comments:2

Kazelmkj 08-09-21 (日) 2:45

Hi webmaster!

Kazelkam 08-09-21 (日) 3:11

Hi webmaster!

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://red-treasure.com/report/wp-trackback.php?p=159
Listed below are links to weblogs that reference
シャッフルシャッフル! from コスミー報告書[社外秘]

Home > Javascript > シャッフルシャッフル!

Search
Feeds
Meta
 合計:011636
 今日:0107 昨日:0165

Return to page top