Help us understand the problem. What is going on with this article?

いろいろな乱数の使い方

More than 3 years have passed since last update.

ビジュアルプログラミングに興味がありちょこちょこ書いているのですが、いろいろ書いているとよく乱数を使う場面に出くわします。
乱数にもいろいろなパターンがあったのでちょっとまとめてみました。

乱数の取り方

普通に取ってみる

基本の乱数取得です。Mathオブジェクトのrandomメソッドで乱数が取れます。
乱数は0以上1未満の値が返ってきます。

app.js
var x = Math.random();

-aからaまでの乱数を取得する

0~1ではなく-1~1などの値で取りたいパターンは以下のように書きます。

app.js
var x = Math.random() * a * 2 - a ;

aからbまでの乱数を取得する

もっと汎用性のある乱数を取りたいのであれば以下のようにすれば取れます。

app.js
var x = Math.random() * (b - a) + a;

aからbまでの整数の乱数を取得する

整数で乱数を返す際はMath.floor()で値を切り捨てにすればOK。
四捨五入だと最小値、最大値の出る確率が低くなってしまうので注意。

app.js
var x = Math.floor(Math.random() * (b - a + 1) + a);

乱数でランダムに実行する

乱数を使用する例としてよくあるのが、ランダムに様々な処理を実行するパターンです。

ランダムな実行方法

そんな時はたとえばこんな風にします。

app.js
function circle(){ /*some code*/ }
function rect(){ /*some code*/ }

var x = Math.random();
if(x < 0.5){
    circle();
}else{
    rect();
}

上記の場合はcircle()、rect()のどちらかが実行されます。

確率をあやつってみる

ランダムな処理でも、実行する確率をあやつりたいパターンがあります。

そんなときは

app.js
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%の確率になります。

別の方法で確率をあやつってみる

またちょっと回りくどいですがこんなやり方もあります。

app.js
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の確率で実行されます。
配列に処理を多く突っ込めば突っ込むほど確率が高くなります。

正規分布

以下のようなコードを書くと中央に値が偏った乱数を取得できます。

app.js
var x = Math.random() * Math.random() * Math.random() * Math.random() * Math.random()* Math.random() / 6;

このような値を正規分布・ガウス分布とも呼ぶらしい。
正規分布 - Wikipedia

こちらから引用させていただきました。詳しい説明も書いてあります。
インタラクティブ・プログラミング勉強会 第1回 乱数 | fladdict

機械的な乱数よりも、より自然な乱数になります。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away