覚書としてメモ。
JavaScriptでMath.random()の乱数を使ってランダムに実行される任意の数の条件分岐の処理を作りたかった。
JavaScriptのrandom関数自体には引数での範囲指定が無い様で自作の関数内でrandom関数を使用して範囲指定出来る様であるが、どうせ異なる選択肢は個別に記述しなければならないわけだし面倒だったので、計算式の除算(割り算)をした余りを求める剰余を使ってみた。
<script>
var a = Math.floor(Math.random()*100);
if(a % 2 == 0) {
/* 処理 */
} else if(a % 2 == 1) {
/* 処理 */
} else {
/* エラー時の処理 */
}
</script>
省略して、
<script>
var a = Math.floor(Math.random()*100);
if(a % 2 == 0) /* 処理 */
else if(a % 2 == 1) /* 処理 */
else /* エラー時の処理 */
</script>
Math.random()で生成される0以上1未満の数に100を掛けてMath.floor()で端数の小数点を繰り下げて0〜99の整数を出させて変数aに代入する。増える選択肢の数を想定してとりあえず余裕を以って100を掛けておく。そして条件分岐の条件式でaを(選択肢の数と同期する値の)2で割った余りの真偽を判定する。2で割った余りは0か1になるので二通りのランダムな判定が得られる。
一つ条件分岐を増やして、3で割れば余りは0,1,2のいずれかになるので三通りの判定が得られる。
数が増えても同じで例えば11で割るなら余りが0,1,2,3,4,5,6,7,8,9,10の11通りの判定が得られる。選択肢が増えてきたら均一なランダム性を得る為にMath.random()に掛ける数字をもっと大きくする。
<script>
var a = Math.floor(Math.random()*100);
if(a % 11 == 0) {
/* 処理 */
} else if(a % 11 == 1) {
/* 処理 */
} else if(a % 11 == 2){
(~ 中略 ~)
} else if(a % 11 == 9) {
/* 処理 */
} else if(a % 11 == 10) {
/* 処理 */
} else {
/* エラー時の処理 */
}
</script>
選択肢となる条件分岐の処理がもっと増えたら繰り返し文とか配列を使うとか他の方法を考えた方が良さそうだが今は少ないのでこれで良いかと。
どうせ処理は個別に違うものを記述するのだし。if文でなくswitch文でも良い。