random_deviceの実装
もしあなたがセンシティヴだとしたら、random_deviceは自分で実装するべきかもしれない。この場合のセンシティヴは、熟練者 (expert) とか古強者 (veteran) とか芸術家 (artist) とほとんど同義かもしれない。
さて、C++0xで導入される乱数ライブラリについては本の虫: C++0xの新しい乱数ライブラリ、randomで解説されている。以下にrandom_deviceのoperator()()を引用する。
N3000 - P.897result_type operator()();
- Returns:
A non-deterministic random value, uniformly distributed between min() and max(), inclusive. It is implementation-defined how these values are generated.
- Throws:
A value of an implementation-defined type derived from exception if a random number could not be obtained.
- 返り値
min()とmax()の間(max()も含む)に一様に分布する非決定性の乱数。どのように値が生成されるかは実装定義である。
- 例外送出:
乱数が得られなかった場合に、exceptionを継承した実装定義の値。
libstdc++-v3の実装を眺める。
result_type operator()() { #ifdef _GLIBCXX_USE_RANDOM_TR1 result_type __ret; std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type), 1, _M_file); return __ret; #else return _M_mt(); #endif }std::tr1::random_device::operator()()_M_fileには/dev/urandomか/dev/randomをfopenした結果の妥当なFILE*が格納されている。このとき、freadが必ず成功するという保証はどこで与えられているのか、調べてみたけれどよく判らない。C file input/output - Wikipediaなんか、読むとむしろ不安になる(というか、この記述はどんなもんだろう)。