Mersenne Twister in JavaScript

Mersenne Twister in JavaScript

© 2006 Magicant / 0.2.4 (2005-12-23)

高性能な擬似乱数生成アルゴリズム「Mersenne Twister」の JavaScript による実装です。 (別途テストページあり)

mt.js は原典のライセンスに反しない限り自由に使用してくださって構いません。

目次

mt.js の使い方

実装ファイルは mt.js です。 このファイルは単独では実行しても意味がありません。 mt.js には Mersenne­Twister オブジェクトの定義が含まれており、これを他の JavaScript コードから呼び出して使います。

Mersenne­Twister オブジェクトの一般的な使用例を以下に挙げます。

var mt = new MersenneTwister();
var integer1 = mt.nextInt(0, 5);  // 0 以上 5 未満の整数
var decimal1 = mt.next();         // 0 以上 1 未満の実数

詳細は API 仕様をご覧下さい。

mt.js の API 仕様

Mersenne­Twister コンストラクタ

new MersenneTwister([int/Array<int> seed])

Mersenne­Twister オブジェクトを初期化します。

乱数生成のための種 (シード) を引数として与えることもできます。 種に関する詳細は set­Seed メソッドを参照してください。 なお、引数を省略した場合は実行時の時刻を数値に変換した値が種となります。

引数が数または配列ではない場合は TypeError をスローします。

setSeed メソッド

void setSeed(int/Array<int> seed)

乱数の種 (シード) を再設定します。Mersenne­Twister コンストラクタとは異なり、引数を省略することはできません。

有効な引数は、1 個の数値、または 0 個以上の数値の配列です。 数値はどのような値でもかまいませんが、0 未満または 232 以上の値は 種として好ましくありません。また、数値は切り捨てて整数にしてから使用するので、 例えば setSeed(3)setSeed(3.4) は同じ結果になります。配列の要素が数値でない場合は、その要素は数値 0 として解釈されます。

このメソッドの戻り値はありません。

引数が数値でも配列でもない場合は TypeError をスローします。

next メソッド

double next()

0 以上 1 未満の一様分布乱数を一つ返します。この乱数の精度は 53 ビットです。

nextInt メソッド

int nextInt([[int min,] int sup])

一様分布整数乱数を一つ返します。引数の数により、返される値の範囲が異なります。

引数が 0 個の場合

返される値は 0 以上 232 未満の整数です。

引数が 1 個の場合

引数は戻り値の範囲の上限 sup となります。返される値は 0 以上 sup 未満の整数です。

ただし、sup の値が 232 以下の正数ではない場合、 返される値は 0 以上 232 未満の整数です。

引数が 2 個以上の場合

一つ目の引数は戻り値の範囲の最小値 min に、二つ目は上限 sup になります。返される値は min 以上 sup 未満の整数です。

min が数ではない場合、最小値は 0 となります。 最小値以上・上限未満の整数が一つも存在しない、または 232 個以上存在する場合、上限は (min + 232) となります。

出力サンプル

実際に以下のプログラムを実行して出力した乱数のサンプルです。

var mt = new MersenneTwister([0x123, 0x234, 0x345, 0x456]);
document.write("<h3>next&shy;Int() による整数乱数 20 個<\/h3>");
document.write("<ul class='enumeration'>");
for (var i = 0; i < 20; i++)
	document.write("<li><samp>" + mt.nextInt() + "<\/samp><\/li>");
document.write("<\/ul>");
document.write("<h3>next() による実数乱数 20 個<\/h3>");
document.write("<ul class='enumeration'>");
for (var i = 0; i < 20; i++)
	document.write("<li><samp>" + mt.next() + "<\/samp><\/li>");
document.write("<\/ul>");