シードなしで乱数が欲しい

Hamigakiライブラリでは次の2箇所で乱数を生成しています。

  • vorbis_encoderのOggシーケンス番号
  • tmp_fileのファイル名の一部

現時点の実装はかなりいい加減なので、この部分を作り直しています。


Boost.Randomにはたくさんの乱数生成器がありますが、(random_deviceを除けば)乱数のシードが必要で、このシードをどうやって決めるかが問題になります。
シードなしで乱数を得る方法としては、多くのUNIX系OSでは擬似デバイス/dev/random、WindowsではCryptGenRandom()関数があります。
しかし、これらの方法は大げさで、失敗する可能性もあり、今回の用途には向きません。
/dev/randomが読めないことでOggエンコーディング失敗ってのも変ですよね。


今回の要件は、

  • 乱数の精度はそれほど必要ない
  • とにかく値が欲しい(失敗しない)が連続で呼んでも違う値が返って欲しい(time()だけでは駄目)
  • シードを指定したくない(呼び出し側でシードを管理したくない)
  • ヘッダだけで済ませたい、余計なライブラリをリンクさせたくない
  • マルチスレッドでもなるべく負荷をかけたくない

といった感じです。まぁ、欲張りすぎと言えば、それまでなのですが。
やっぱり、シードをグローバル(orスレッド固有領域)に置くしかないですかね。