SFMTを利用できるようにするまでをまとめます。(※現状上手く動いていません、備忘用メモ程度です……)
ダウンロード
下記URLからダウンロードします。
SIMD-oriented Fast Mersenne Twister (SFMT)
配置
解凍して配置します。
SFMTはビルドしなければ利用できません。また今回は別のプロジェクトで使い回す予定がなかったので、CLionで予めプロジェクトを作成し、そこの中に入れてプロジェクトと一緒にビルドする形としました。
という訳でプロジェクトのフォルダ構成は以下のようになります。SFMT-src-1.5.1直下にヘッダなどが入っています。
ビルド設定
今回は下記の1-1を参考にCMakeListsに設定を書きました。
How to compile SFMT
CMakeListsの内容は以下の通りです。SSE利用の設定がどうたらいう話も見ましたが、とりあえず読めていないのでここでは触れません。
cmake_minimum_required(VERSION 3.10) project(SFMT_Test) set(CMAKE_CXX_STANDARD 11) set(SOURCE_FILES main.cpp SFMT-src-1.5.1/SFMT.c) add_executable(SFMT_Test ${SOURCE_FILES})
利用
ちゃちゃっといた確認用コードは以下です。
#include <iostream> #include "SFMT-src-1.5.1/SFMT.h" using namespace std; int main() { sfmt_t sfmt; sfmt_init_gen_rand(&sfmt, 0); cout << sfmt_genrand_uint64(&sfmt) << endl; cout << sfmt_genrand_uint64(&sfmt) << endl; cout << sfmt_genrand_uint32(&sfmt) << endl; return 0; }
実行結果
C:\Users\wrongwrong\CLionProjects\SFMT_Test\cmake-build-debug\SFMT_Test.exe 1139168856888879704 6881867631762694802 3373935053
参考にしたページ
トラブル
コードを以下のように書き換え、32ビット乱数の生成後に64ビット乱数の生成を行うとAssertionが起きています。順序が逆では発生していません。
時間が無いので気が向いたら原因究明までやるかも?
#include <iostream> #include "SFMT-src-1.5.1/SFMT.h" using namespace std; int main() { sfmt_t sfmt; sfmt_init_gen_rand(&sfmt, 0); cout << sfmt_genrand_uint32(&sfmt) << endl; cout << sfmt_genrand_uint64(&sfmt) << endl; return 0; }
実行結果
C:\Users\wrongwrong\CLionProjects\SFMT_Test\cmake-build-debug\SFMT_Test.exe 772581976 Assertion failed: sfmt->idx % 2 == 0, file c:\users\wrongwrong\clionprojects\sfmt_test\SFMT-src-1.5.1/SFMT.h, line 167 Process finished with exit code 3