A. メルセンヌ・ツイスターをインストールしてみる

「Mersenne Twister Home Page」

色々あるけれど、まずは本家の C プログラム mt19937ar.sep.tgz を試してみた。

必要な関数の入っている mt19937ar.c をコンパイルして、 オブジェクト・ファイルを作り、テスト・プログラム mtTest.c をコンパイル&リンクし、 実行結果を付属する mt19937ar.out と比較する。
cd $SOMEWHERE
tar xzf mt19937ar.sep.tgz
gcc -O -c mt19937ar.c
gcc -o mtTest mtTest.c mt19937ar.o
./mtTest > foo
diff foo mt19937ar.out
これで何も表示されなければ成功ということ。

インストールするには、少々強引だが、
ar cr libmt19937ar.a mt19937ar.o
ranlib libmt19937ar.a
sudo cp -p libmt19937ar.a /usr/local/lib
sudo cp -p mt19937ar.h /usr/local/include
これで C プログラムの中に
#include <mt19937ar.h>
として、 リンクするときに -lmt19937ar というリンカー・オプションを指定する。

初期化は
  unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
  init_by_array(init, length);
のように unsigned long int の配列データで初期化するか、
  init_genrand((unsigned long)20120328);
のように unsigned long int 型データで初期化する。 もちろん (srand() でやったように)
  init_genrand((unsigned long)time(NULL));
のように time() を使っても良いだろう。

C++ では、新しい規格ではメルセンヌ・ツイスターが含まれているそうだが (もう g++ で使えるの?)、 この C バージョンも利用可能である。

(1)
C++ プログラム中に
extern "C" {
#include "mt19937ar.h"
};
のようにインクルードする。
(2)
mt19937ar.c を C++ プログラムとして利用する。
cp -p mt199e7ar.c mt19937ar.cpp
g++ -O -c mt19937ar.cpp
桂田 祐史
2017-04-29