Mersenne Twister

最終更新日:1998年11月28日

 慶応義塾大学の松本先生のページで公開されている疑似乱数生成アルゴリズムMersenne Twisterを、Windows上のDLLとして実現してみました。このアルゴリズムの詳細については、Mersenne Twister Home Pageを参照してください。DLLにしたことにより、Windows上で動作するさまざまな言語から利用できると思います。

公開するAPI

 生成する乱数の値の範囲により、Mersenne Twisterのいくつかのプログラムが提供されていますが、ここでは半開区間[0,1)バージョン mt19937-2.cをベースにしています。オリジナル版からの変更点として、sgenrandの引数seedの型が、unsigned longからlongになっています。これは、VisualBasicやDelphi(バージョン3まで)のように、unsigned longをサポートしない言語のためです。したがって、seedに指定できる値は2^31 - 1までです。ただし、seedには負の数を指定しないでください。

 このDLL(libMT.dll)は、次の二つのAPIを公開しています。

名前 戻り値の型 引数 機能
sgenrand なし long seed 乱数のseedを設定する。
genrand double なし 乱数を生成する。生成する乱数の値の範囲は、0≦x<1。

使用例

 例えばVisualBasicの場合、次のようにして使用します。

(0) ダウンロードしたlibMT.dllを、\winnt\system32(Windows95/98の場合は、\Windows\system)などのディレクトリにコピーする。

(1) 標準モジュールで上記APIを宣言する。

Public Declare Function genrand Lib "libMT" () As Double
Public Declare Sub sgenrand Lib "libMT" (ByVal seed As Long)

(2)必要に応じて、これらを呼び出す。

Private Sub Command1_Click()
    Text1.Text = Format$(genrand, "0.000000")
End Sub

Private Sub Form_Load()
    sgenrand 567
End Sub

 また、Excelで使用する例は、次のとおりです。

(0)上の(0)と同じ。

(1)Excelの[表示|ツールバー|コントロールツールボックス]を選択して、ツールボックスを表示し、コマンドボタンをワークシート上に配置する。

(2)配置したボタンをダブルクリックして、イベントハンドラに次のように記述する。Cells(5, 2)にはseedの値を入力する。Cells(i, 3)には生成した乱数を表示する。セル番号は、ワークシートにあわせること。

Private Sub cmdGenRand_Click()
    Dim i As Long

    sgenrand Cells(5, 2).Value

    For i = 1 To 10
        Cells(i, 3).Value = genrand
    Next
End Sub

(3)標準モジュールを追加し、VisualBasicの例の(1)と同じ内容を記述する。

(4)名前を付けて保存し、Excelを終了して、再度保存したファイルを開き、seedを入力してコマンドボタンを押すと、生成した乱数を10個表示する。

 この実行結果は、次のようになります。

ExcelでMTを使った例

注意事項

 このDLLは、まだ、マルチスレッドに対応していません。複数のスレッドやプロセスから同時に使用すると、誤った値を生成する可能性があります。

 オリジナルは高速性を重視して作成されていますが、このDLL版は(測定していませんが)オリジナルに比べて速度はかなり低下していると思われます。

著作権

 オリジナルの著作権表示は次のとおり。

/* This library is free software; you can redistribute it and/or */
/* modify it under the terms of the GNU Library General Public */
/* License as published by the Free Software Foundation; either */
/* version 2 of the License, or (at your option) any later */
/* version. */
/* This library is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */
/* See the GNU Library General Public License for more details. */
/* You should have received a copy of the GNU Library General */
/* Public License along with this library; if not, write to the */
/* Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA */
/* 02111-1307 USA */

/* Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. */
/* When you use this, send an email to: matumoto@math.keio.ac.jp */
/* with an appropriate reference to your work. */

ダウンロード

(1) DLLバイナリ

ファイル名 libMT.lzh
バージョン 1.0
ファイルサイズ 31Kバイト
OS Windows NT 4.0 (Windows 95/98でも動作すると思いますが未確認です)
アーカイブの内容 libMT.dll ... Mersenne Twister DLL
備考 アーカイブを展開して、winnt\system32(Windows95/98の場合は、Windows\system)などのディレクトリにコピーしてお使いください。

(2) ソースコード

ファイル名 MTmain.pas
バージョン 1.0
備考 このソースコードは、Delphi 4専用です。それ以前のDelphiでは、コンパイルできるかもしれませんが、正しく動作しません。Delphi 4では、DLLプロジェクトを作成し、このファイルを追加してビルドすれば、上記DLLが作成できます。

ホーム