今頃になって知ったのですが、擬似乱数を生成する「メルセンヌ・ツイスタ」のコンパクト版がリリースされてました。(2011/6/20リリース)
TinyMT は Mersenne Twister にとって代わるものではなく、 メモリの制約などによって、Mersenne Twister を使用しにくい場面で 使用出来る、状態空間の大きさの割にはそこそこよい疑似乱数生成器です。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index-jp.html
本家MT法はコード規模が以外と大きかったので、組み込み用途の「それなりの擬似乱数」は、これで良いんじゃ無いかと思います。
実際に使うかどうかは、
- ダイハードに食わせる
- 画面に点を打って格子模様が現れるかどうか
を、実際に自分で手を動かしながら検証してからになりますが。
ライセンス
「三項 BSDライセンス」で配布されており商用利用も可能と書いてあります。
ライセンス(企業で使用する場合)
オープンソース一般の話になりますが、オープンソースを企業で使用されるときは法務部に相談した方が良いです。
なぜなら、
- 「あなたが勤務している会社」と「ネット上」で法律の解釈が異なることがある。
- 商売を日本国内で行う場合と国外(先進国・新興国、、、)で法律の解釈が異なることがある。
そんな、大げさなと思われるかもしれませんが、実際に訴えられたとき、いい大人が「ネット上にこう書いてあったから、、、」と説明しますか?
餅は餅屋ですな。
コードレビュー(32bit整数版)
以下は、乱数を生成する箇所のコードです。
ぱっと見た特徴は、
- 条件分岐なし
- テーブル参照無し
- 乗算除算なし(ビット演算のみ使用)
と、CPUに優しいコードになっています。
inline static uint32_t tinymt32_generate_uint32(tinymt32_t * random) { tinymt32_next_state(random); return tinymt32_temper(random); } inline static float tinymt32_temper_conv(tinymt32_t * random) { uint32_t t0, t1; union { uint32_t u; float f; } conv; t0 = random->status[3]; #if defined(LINEARITY_CHECK) t1 = random->status[0] ^ (random->status[2] >> TINYMT32_SH8); #else t1 = random->status[0] + (random->status[2] >> TINYMT32_SH8); #endif t0 ^= t1; conv.u = ((t0 ^ (-((int32_t)(t1 & 1)) & random->tmat)) >> 9) | UINT32_C(0x3f800000); return conv.f; } inline static float tinymt32_temper_conv_open(tinymt32_t * random) { uint32_t t0, t1; union { uint32_t u; float f; } conv; t0 = random->status[3]; #if defined(LINEARITY_CHECK) t1 = random->status[0] ^ (random->status[2] >> TINYMT32_SH8); #else t1 = random->status[0] + (random->status[2] >> TINYMT32_SH8); #endif t0 ^= t1; conv.u = ((t0 ^ (-((int32_t)(t1 & 1)) & random->tmat)) >> 9) | UINT32_C(0x3f800001); return conv.f; }
基礎研究について
TimyMTの研究は日本学術振興会科学研究費の補助を受けているそうです。(No. 21654004.)
科学研究費助成事業とは
科学研究費助成事業(学術研究助成基金助成金/科学研究費補助金)は、人文・社会科学から自然科学まで全ての分野にわたり、基礎から応用までのあらゆる「学術研究」(研究者の自由な発想に基づく研究)を格段に発展させることを目的とする「競争的研究資金」であり、ピア・レビューによる審査を経て、独創的・先駆的な研究に対する助成を行うものです。
http://www.jsps.go.jp/j-grantsinaid/
研究結果を、ありがたく使わせてもらいます。