シードなしで乱数が欲しい
Hamigakiライブラリでは次の2箇所で乱数を生成しています。
現時点の実装はかなりいい加減なので、この部分を作り直しています。
Boost.Randomにはたくさんの乱数生成器がありますが、(random_deviceを除けば)乱数のシードが必要で、このシードをどうやって決めるかが問題になります。
シードなしで乱数を得る方法としては、多くのUNIX系OSでは擬似デバイス/dev/random、WindowsではCryptGenRandom()関数があります。
しかし、これらの方法は大げさで、失敗する可能性もあり、今回の用途には向きません。
/dev/randomが読めないことでOggエンコーディング失敗ってのも変ですよね。
今回の要件は、
- 乱数の精度はそれほど必要ない
- とにかく値が欲しい(失敗しない)が連続で呼んでも違う値が返って欲しい(time()だけでは駄目)
- シードを指定したくない(呼び出し側でシードを管理したくない)
- ヘッダだけで済ませたい、余計なライブラリをリンクさせたくない
- マルチスレッドでもなるべく負荷をかけたくない
といった感じです。まぁ、欲張りすぎと言えば、それまでなのですが。
やっぱり、シードをグローバル(orスレッド固有領域)に置くしかないですかね。