福引の当たりに重みを付けよう
前回は福引プログラムを作りましたが、1等賞から6等賞まで全て同じ確率で当たりました。
通常、1等賞が当たる確率は低く、6等賞が当たる確率は高いので、今回は当たる確率に重みを付けてみましょう。
福引の賞の重みの付け方
各賞に重みを付けるために、以下のようなオブジェクトを定義します。
var object = {'1等賞':1,'2等賞':4,'3等賞':8,'4等賞':12,'5等賞':25,'6等賞':50}
1等賞は1%、2等賞は4%、3等賞は8%、4等賞は12%、5等賞は25%、6等賞は50%の出現確率になるイメージです。
考え方としては、0から99の整数の中からランダムで値を取得して、その値が以下のどの賞に当たるかを判定します。
1等賞:0
2等賞:1~4
3等賞:5~12
4等賞:13~24
5等賞:25~49
6等賞:50~99
0から99の中からランダムに値を取得するコードは、以下のようになります。
var number = Math.floor(Math.random() * 100);
上記のコードは、Math.random()によって0から1未満の値をランダムに出力して、それに100を掛けてからMath.floor()で小数点以下を切り捨てるという意味になります。
重みを付けた福引プログラム
福引の賞に重みを付けたプログラムは、以下のようになります。
26行目から32行目が、ランダム値がどの賞に当たるのかを決める処理です。
定義したオブジェクトからキー(賞)を取得し、その重み(確率)を変数weightに加算していきます。
変数weightは1等賞の時は1、2等賞の時は5、3等賞の時は13、4等賞の時は25、5等賞の時は50、6等賞の時は100となります。
ランダム値を表す変数numberと重みを表す変数weightを比較して、変数numberの方が小さければキー(賞)を保存して、ループを終了します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <!DOCTYPE html> <html> <head>   <meta charset="UTF-8">   <title>Roulette</title> </head> <body>   <input type="button" value="スタート" onclick="startRoulette();"></input>   <input type="button" value="ストップ" onclick="stopRoulette();"></input>   <div id="pos1"></div>   <script type="text/javascript">     // グローバル変数     var timer;     // 開始関数     function startRoulette() {       timer = setInterval("drawRoulette();", 100);     }     // 終了関数     function stopRoulette() {       clearInterval(timer);     }     // ルーレット関数     function drawRoulette() {       var object = {'1等賞':1,'2等賞':4,'3等賞':8,'4等賞':12,'5等賞':25,'6等賞':50};       var number = Math.floor(Math.random() * 100);       var weight = 0;       for (var key in object) {         weight += object[key];         if (number < weight) {             value = key;             break;         }       }       var id1 = document.getElementById('pos1');       id1.style.fontSize = "32pt";       id1.style.color = "blue";       id1.innerHTML = value;     }   </script> </body> </html> | 
スタートボタンを押下するとオブジェクトに定義したキーがランダムで次々に表示され、ストップボタンを押下するとランダム表示の処理が終了して、最後に表示されたキーがそのまま残ります。
JavaScriptの詳しい使い方は、以下の「MDN Web Docs」を参照してください。