色々あるけれど、まずは本家の 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 |
#include <mt19937ar.h> |
初期化は
unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; init_by_array(init, length); |
init_genrand((unsigned long)20120328); |
init_genrand((unsigned long)time(NULL)); |
C++ では、新しい規格ではメルセンヌ・ツイスターが含まれているそうだが (もう g++ で使えるの?)、 この C バージョンも利用可能である。
extern "C" { #include "mt19937ar.h" }; |
cp -p mt199e7ar.c mt19937ar.cpp g++ -O -c mt19937ar.cpp |