非復元抽出アルゴリズム for JavaScript
結婚式の二次会の余興でBINGOゲームを作る事になりました(一番最後に新郎がビンゴを引き当てるという仕掛け付きなので自作する事にしました)。
で、BINGOゲームは1~75の数字をどんどん抽選していく、いわゆる非復元抽出です。
JavaScriptで実装しようと考えていたときにアルゴリズムがふと思い浮かんだので備忘録として記録しておきます。
昔は「乱数で適当に抽選して重複したら抽選しなおす」方法を良く使っていました。
実用的には問題ないですが、抽選のやり直しが発生したり抽選結果を保持する必要があったりでかっこよくはありません。
JavaScriptで実装する前提で考えた結果、抽選結果を単純に消していけば良いことに気づきました。
C言語だとこれ自体がめんどくさい処理でしたが…
//種
var sheed=[1,2,3,4,5,6,7,8,9,10...75];
function choose() {
//番号選択
if (sheed.length == 0) {
//エラー処理
}
var num = sheed[Math.floor(Math.random() * sheed.length)];
var value = sheed[num];
//選んだ番号は取り出してしまう。
sheed.splice(num,1);
return value;
}
使用例