メルセンヌ・ツイスタ(MT)は高性能な乱数を作るのによく使われるアルゴリズムの1つ
従来の乱数だと周期が短かったりで偏りがありましたが、MTだと(2の19937乗 - 1)という長い周期を使用していて乱数作成の速度も他のアルゴリズムよりかなり高速です。
そのため高品質な乱数を作成するのに欠かせません。
このMT乱数をJavaScriptで生成するのに使えるのが mt.js というライブラリ
フリーのライブラリでライセンスの範囲内なら自由(商用利用も可)に利用できます。
ここではこの mt.js での乱数作成のやり方やコード例についてまとめてみました。
mt.jsの基本的な使い方
このライブラリを使うとメルセンヌ・ツイスタ乱数が簡単に作成できます。
その基本的な作り方をコード例を使って説明すると次の通り
まずこちらのURLから mt.js をダウンロードしましょう。
https://magicant.github.io/sjavascript/mt.js
そうしたらMT乱数を使いたいページで mt.js を次のように読み込み
1 |
<script type="text/javascript" src="mt.js"></script> |
上記のようにダウンロードした mt.js だけを読み込ませればOKです。メルセンヌ・ツイスタ乱数を生成するだけならこれ以外のライブラリは一切必要ありません。
ただし直リンクは作者様に迷惑がかかるので必ずダウンロードしたものを読み込みしましょう。
ライブラリを読み込んだら次の手順でMT乱数を作ることが可能です。
まず MersenneTwister オブジェクトを作成
1 |
var mt = new MersenneTwister(); |
そして次にシード(種)を setSeed メソッドから 0 以上または 2の32乗 未満の値で設定
1 |
mt.setSeed(10); |
同じシードを設定すれば何度でも同じ乱数列を生成可能です。
最後に乱数メソッド呼び出しでMT乱数を取得
1 |
var rand = mt.next(); |
mt.js ではnextメソッドを使うことで標準のrandメソッドと範囲の乱数(0以上1未満の乱数)を生成させることができます。
ちなみに全体のコードを載せると次の通り
1 2 3 4 5 6 |
/** 乱数作成の準備 */ var mt = new MersenneTwister(); mt.setSeed(10); /** 0以上1未満の乱数取得 */ var rand = mt.next(); |
MersenneTwisterオブジェクトが乱数作成に必要な点に注意です。
以上が mt.js を使った乱数作成の基本的な手順です。
次はこのライブラリで使える乱数メソッドについて少し説明します。
mt.jsで使える乱数メソッドについて
mt.jsでは次の2つのメソッドを乱数作成に使用可能
- nextメソッド
- nextIntメソッド
next は少数の乱数、 nextInt の方は整数の乱数を作成するのに使えます。
その詳しい使い方やコード例は次の通り
nextメソッド
nextメソッドは0以上1未満の乱数を発生させるメソッド
次のように next を呼び出せばその範囲の乱数を得ることが可能です。
1 |
var rand = mt.next(); |
ちなみにこのメソッドによる乱数の精度は53ビットの模様
このnextメソッドですがJS標準の Math.random と全く同じ動作をさせることができます。
なので次記事で紹介したテクニックもそのまま使用可能です。
上記の記事では Math.random() を乱数作成に使っていますが、それを mt.next() に置き換えても問題なく動作すると思います。
nextIntメソッド
nextIntメソッドはある範囲内の整数の乱数を返すメソッド
このメソッドに引数を0個以上2個以下の範囲でとらせることが可能です。
それぞれ引数を0個、1個、2個渡したときの動作は次のコード例の通り
まず初めは0個の乱数を渡した場合・・・
例えば次のようなコードを実行したとします。
1 |
var rand = mt.nextInt(); |
この場合だと返ってくる乱数の範囲は 0 以上 2の32乗 未満の整数となります。
範囲が大きすぎるのであまり使う場面はないかも
お次は1個の引数を渡した場合・・・
この場合は0以上かつ渡した引き数未満の乱数が返ってきます。
例えば次コードのように引数に 5 を渡したとしましょう。
1 |
var rand = mt.nextInt(5); |
この場合、返ってくる乱数の範囲は0以上5未満( 0 <= rand < 5 )になります。
ただし「5未満」なので5自体は含まれません。
なので渡した引数が乱数の境界に含まれないことに要注意です。
最後は引数を2つ渡した場合・・・
その場合1つめの引数以上2つめの引数未満の乱数が返ってきます。
例えば次コードのように1つめに 10 、2つめに 20 という値を渡したとしましょう。
1 |
var rand = mt.nextInt(10, 20); |
この場合返される値は10以上20未満( 10 <= rand < 20 )になります。
引数2つの場合も最後の引数が境界に含まれない点に注意です。
ここまでのまとめ
以上JavaScriptでメルセンヌ・ツイスタ乱数が使える mt.js の使い方についてでした。
高精度で高速な乱数が求められる場面で役に立つと思います。