2013-07-22 15 views
6

私はこのプログラムの出力のを見て驚いた。std :: uniform_real_distributionはいくつの乱数を使用しますか?

#include <iostream> 
#include <random> 

int main() 
{ 
    std::mt19937 rng1; 
    std::mt19937 rng2; 
    std::uniform_real_distribution<double> dist; 

    double random = dist(rng1); 
    rng2.discard(2); 

    std::cout << (rng1() - rng2()) << "\n"; 

    return 0; 
} 

0である - すなわちstd::uniform_real_distributionは、範囲[0,1)にランダムdouble値を生成する2個の乱数を使用します。私はそれがちょうど1つを生成し、それを再スケーリングすると思った。それについて考えると、std::mt19937は32ビットのintを生成し、doubleはこのサイズの2倍であり、したがって「十分にランダム」ではないからです。

質問:乱数ジェネレータと浮動小数点タイプが任意のタイプの場合、この数値は一般にどのようにして調べられますか?

編集:私はちょうどstd::generate_canonicalを使用できることに気付きました。私は[0,1]の乱数だけに興味があるためです。これが違いを生むかどうかはわかりません。

+0

これは一般的には見つかりません。 –

+2

@ R.MartinhoFernandes:because ... – arne

+1

32ビット整数を64ビットdoubleに "rescale"することを意味するものを考えると、約2^62の別個のdouble値があります。 2^32個の異なるint値があります。これは、結果として得られる倍精度で表現可能な倍精度**の可能性のある** **のうち1つのみ**を意味します。これは明らかに容認できません。 – JohannesD

答えて

2

template<class RealType, size_t bits, class URNG> std::generate_canonicalための標準(セクション27.5.7.2)が明示的

MAX(1、B/log_2 R)であると一様乱数発生器(URNG)へのコールの数を定義し、

bは、RealTypeの仮数部のビット数とgenerate_canonicalにテンプレートパラメータとして与えられるビット数の最小値です。 Rは、URNGが返す数値の範囲です。(URNG::max()-URNG::min()+1)です。 しかし、あなたの例では、ダブルクリックの仮数の53ビットを埋めるためにmt19937を2回呼び出す必要があるので、これは何の違いもありません。

他のディストリビューションでは、標準では、1つのディストリビューションを取得するためにURNGが生成する数字の数に関する情報を得るための一般的な方法は提供されていません。

一部のディストリビューションでは、単一のディストリビューション番号を生成するために必要な番号の一様乱数は固定ではなく、コールごとに異なる場合があります。一例は、std::poisson_distributionであり、これらの数の積が一定の閾値に達するまで、各反復において一様乱数を引き出すループとして通常実装される(例えばimplementation of the GNU C++ library(行1523~1528)を参照)。

関連する問題