このプログラムの出力を見て驚いた:
#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;
}
is 0
- つまり、 2 つのstd::uniform_real_distribution
乱数を使用して範囲 [0,1) の乱数を生成します。1つ生成してそれを再スケーリングするだけだと思いました。考えてみると、これは32ビットのintを生成し、doubleがこのサイズの2倍であるため、「十分にランダム」ではないためだと思います。double
std::mt19937
質問: 乱数ジェネレーターと浮動小数点型が任意の型である場合、この数値を一般的に調べるにはどうすればよいですか?
std::generate_canonical
編集: [0,1) の乱数のみに関心があるため、代わりに使用できることに気付きました。これが違いを生むかどうかはわかりません。