プログラムで使うことの多い「乱数」。ゲーム開発やビジュアルアート、ウェブサイトのアニメーションにおいて乱数は非常に重要で、様々な用途で利用されています。プログラムで一般に乱数と聞くと、全ての数値が同じ頻度(分布)で出現する「一様乱数」と呼ばれる乱数をイメージする方が多いと思います。

多くの場合はこの「一様乱数」で取得した乱数を用いれば十分でしょう。しかし、場合によっては「一様乱数」ではなく、偏りのある乱数を用いることでコンテンツの見た目や現象の「自然さ」を演出することが可能です。

実は「一様乱数」に一手間加えることで、乱数の分布の偏りを制御できます。今回は乱数を使用して好みの分布を得るためのパターンをいくつか紹介します。

乱数分布のシミュレーションデモ (HTML5製)

次のデモはリアルタイムで乱数の出現頻度を計算し、グラフに可視化するコンテンツです。画面下のプルダウンで乱数の種類を選択すると、選択した方式に応じた乱数の出現頻度分布を表示します。

※このデモはCreateJS 2015年11月版TypeScript 1.8で開発しています。

それぞれの乱数の数式と傾向・使いどころを紹介します。

通常の乱数 – 一様乱数

分布図

// 通常の乱数
var value = Math.random();

一様乱数と呼ばれ、0.0から1.0までの値が均等に出現する乱数です。JavaScriptなどでMath.random()関数として提供されおり、ほとんどのプログラミング言語で標準で用意されているのはこの一様乱数の関数のみです。普段一番よく使う乱数でしょう。

乱数の加算 : 中央に偏らせる

加算方式の乱数分布図

// 乱数の加算
var value = (Math.random() + Math.random()) / 2;

乱数を2回発生させて、足し合わせたものです。分布は直線的になり、中央の値の出現率が高くなります。

乱数の乗算 – ゼロ付近の割合を多くする

乗算方式の乱数分布図

// 乱数の乗算
var value = Math.random() * Math.random();

乱数を2回発生させて、掛け合わせたものです。0.0付近の出現率が高くなります。値が大きくなるにつれて出現率が減るので、自然な偏りをもたせたい場合に使用できます。

乱数の2乗 – ゼロ付近の割合をさらに多くする

2乗の乱数方式の分布図

// 乱数の2乗
var r = Math.random();
var value = r * r;

乱数を2乗したもの。0.0付近の出現率が飛び抜けて高くなり、乗算の乱数と比べて急激な分布になります。0.1より高い数値の出現が近くなるのも特徴です。明確に偏りを持たせたい場合はこちらを使用します。

このように乱数を組み合わせることで様々な分布が得られます。次のページでは「乱数の平方根」「正規乱数」「分布の反転」について紹介します。