JavaScriptでメルセンヌ・ツイスト乱数を使う方法まとめ【mt.js】

メルセンヌ・ツイスタ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 を次のように読み込み

上記のようにダウンロードした mt.js だけを読み込ませればOKです。メルセンヌ・ツイスタ乱数を生成するだけならこれ以外のライブラリは一切必要ありません。

ただし直リンクは作者様に迷惑がかかるので必ずダウンロードしたものを読み込みしましょう。

 

ライブラリを読み込んだら次の手順でMT乱数を作ることが可能です。

 

まず MersenneTwister  オブジェクトを作成

そして次にシード(種)を setSeed  メソッドから 0 以上または 2の32乗 未満の値で設定

同じシードを設定すれば何度でも同じ乱数列を生成可能です。

 

最後に乱数メソッド呼び出しでMT乱数を取得

mt.js ではnextメソッドを使うことで標準のrandメソッドと範囲の乱数(0以上1未満の乱数)を生成させることができます。

 

ちなみに全体のコードを載せると次の通り

MersenneTwisterオブジェクトが乱数作成に必要な点に注意です。

 

以上が mt.js を使った乱数作成の基本的な手順です。

次はこのライブラリで使える乱数メソッドについて少し説明します。

mt.jsで使える乱数メソッドについて

mt.jsでは次の2つのメソッドを乱数作成に使用可能

  • nextメソッド
  • nextIntメソッド

next  は少数の乱数、 nextInt  の方は整数の乱数を作成するのに使えます。

その詳しい使い方やコード例は次の通り

nextメソッド

nextメソッドは0以上1未満の乱数を発生させるメソッド

次のように next  を呼び出せばその範囲の乱数を得ることが可能です。

ちなみにこのメソッドによる乱数の精度は53ビットの模様

 

このnextメソッドですがJS標準の Math.random  と全く同じ動作をさせることができます。

なので次記事で紹介したテクニックもそのまま使用可能です。

上記の記事では Math.random()  を乱数作成に使っていますが、それを mt.next()  に置き換えても問題なく動作すると思います。

nextIntメソッド

nextIntメソッドはある範囲内の整数の乱数を返すメソッド

このメソッドに引数を0個以上2個以下の範囲でとらせることが可能です。

それぞれ引数を0個、1個、2個渡したときの動作は次のコード例の通り

 

まず初めは0個の乱数を渡した場合・・・

例えば次のようなコードを実行したとします。

この場合だと返ってくる乱数の範囲は 0 以上 2の32乗 未満の整数となります。

範囲が大きすぎるのであまり使う場面はないかも

 

お次は1個の引数を渡した場合・・・

この場合は0以上かつ渡した引き数未満の乱数が返ってきます。

例えば次コードのように引数に 5  を渡したとしましょう。

この場合、返ってくる乱数の範囲は0以上5未満( 0 <= rand < 5  )になります。

ただし「5未満」なので5自体は含まれません。

なので渡した引数が乱数の境界に含まれないことに要注意です。

 

最後は引数を2つ渡した場合・・・

その場合1つめの引数以上2つめの引数未満の乱数が返ってきます。

例えば次コードのように1つめに 10  、2つめに 20  という値を渡したとしましょう。

この場合返される値は10以上20未満( 10 <= rand < 20  )になります。

引数2つの場合も最後の引数が境界に含まれない点に注意です。

ここまでのまとめ

以上JavaScriptでメルセンヌ・ツイスタ乱数が使える mt.js の使い方についてでした。

高精度で高速な乱数が求められる場面で役に立つと思います。