ビジュアルプログラミングに興味がありちょこちょこ書いているのですが、いろいろ書いているとよく乱数を使う場面に出くわします。
乱数にもいろいろなパターンがあったのでちょっとまとめてみました。
乱数の取り方
普通に取ってみる
基本の乱数取得です。Mathオブジェクトのrandomメソッドで乱数が取れます。
乱数は0以上1未満の値が返ってきます。
var x = Math.random();
-aからaまでの乱数を取得する
0~1ではなく-1~1などの値で取りたいパターンは以下のように書きます。
var x = Math.random() * a * 2 - a ;
aからbまでの乱数を取得する
もっと汎用性のある乱数を取りたいのであれば以下のようにすれば取れます。
var x = Math.random() * (b - a) + a;
aからbまでの整数の乱数を取得する
整数で乱数を返す際はMath.floor()で値を切り捨てにすればOK。
四捨五入だと最小値、最大値の出る確率が低くなってしまうので注意。
var x = Math.floor(Math.random() * (b - a + 1) + a);
乱数でランダムに実行する
乱数を使用する例としてよくあるのが、ランダムに様々な処理を実行するパターンです。
ランダムな実行方法
そんな時はたとえばこんな風にします。
function circle(){ /*some code*/ }
function rect(){ /*some code*/ }
var x = Math.random();
if(x < 0.5){
circle();
}else{
rect();
}
上記の場合はcircle()、rect()のどちらかが実行されます。
確率をあやつってみる
ランダムな処理でも、実行する確率をあやつりたいパターンがあります。
そんなときは
function circle(){ /*some code*/ }
function triangle(){ /*some code*/ }
function rect(){ /*some code*/ }
var x = Math.random();
if(x < 0.4){
circle();
}else if(x < 0.75){
triangle();
}else{
rect();
}
上記の場合はcircle()が40%、trangle()が35%、rect()が25%の確率になります。
別の方法で確率をあやつってみる
またちょっと回りくどいですがこんなやり方もあります。
function circle(){ /*some code*/ }
function triangle(){ /*some code*/ }
function rect(){ /*some code*/ }
var results = [];
results[0] = circle;
results[1] = circle;
results[2] = circle;
results[3] = triangle;
results[4] = triangle;
results[5] = rect;
function intRandom(a, b){
return Math.floor(Math.random() * (b - a + 1) + a);
}
var x = intRandom(0, 5);
results[x]();
実行したい関数を配列に突っ込んで整数の乱数で処理を変更するパターン。
上記の場合 circle、triangle、rectが3:2:1の確率で実行されます。
配列に処理を多く突っ込めば突っ込むほど確率が高くなります。
正規分布
以下のようなコードを書くと中央に値が偏った乱数を取得できます。
var x = Math.random() * Math.random() * Math.random() * Math.random() * Math.random()* Math.random() / 6;
このような値を正規分布・ガウス分布とも呼ぶらしい。
正規分布 - Wikipedia
こちらから引用させていただきました。詳しい説明も書いてあります。
インタラクティブ・プログラミング勉強会 第1回 乱数 | fladdict
機械的な乱数よりも、より自然な乱数になります。