とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

Tiny Mersenne Twister (TinyMT)

今頃になって知ったのですが、擬似乱数を生成する「メルセンヌ・ツイスタ」のコンパクト版がリリースされてました。(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/

研究結果を、ありがたく使わせてもらいます。