私はこのプログラムの出力のを見て驚いた。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]の乱数だけに興味があるためです。これが違いを生むかどうかはわかりません。
これは一般的には見つかりません。 –
@ R.MartinhoFernandes:because ... – arne
32ビット整数を64ビットdoubleに "rescale"することを意味するものを考えると、約2^62の別個のdouble値があります。 2^32個の異なるint値があります。これは、結果として得られる倍精度で表現可能な倍精度**の可能性のある** **のうち1つのみ**を意味します。これは明らかに容認できません。 – JohannesD