я был удивлен видеть, что выход этой программы:Сколько случайных чисел использует 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
использует два случайных чисел, чтобы произвести случайное double
значение в диапазоне [0,1). Я думал, что это просто сгенерирует один и перемасштабирует это. Подумав об этом, я предполагаю, что это связано с тем, что std::mt19937
производит 32-битные int и double в два раза больше этого размера и, следовательно, не «случайным образом».
Вопрос: Как узнать это число в общем случае, т. Е. Если генератор случайных чисел и тип с плавающей точкой являются произвольными типами?
Редактировать: Я только заметил, что вместо этого могу использовать std::generate_canonical
, так как меня интересуют только случайные числа [0,1]. Не уверен, что это имеет значение.
Вы не можете найти это в общих чертах. –
@ R.MartinhoFernandes: потому что ... – arne
Как в стороне, подумайте, что это означало бы «перемасштабировать» 32-битное целое число в 64-битном двойном: имеется приблизительно 2^62 различных двойных значения. Существует 2^32 различных значения int. Это означает, что только ** один из каждых миллиардов ** возможных двойных значений будет представлен в двойном результате. Это явно неприемлемо. – JohannesD