random_deviceの実装

もしあなたがセンシティヴだとしたら、random_deviceは自分で実装するべきかもしれない。この場合のセンシティヴは、熟練者 (expert) とか古強者 (veteran) とか芸術家 (artist) とほとんど同義かもしれない。


さて、C++0xで導入される乱数ライブラリについては本の虫: C++0xの新しい乱数ライブラリ、randomで解説されている。以下にrandom_deviceのoperator()()を引用する。

result_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なんか、読むとむしろ不安になる(というか、この記述はどんなもんだろう)。

N3000 - P.897