ja zaskoczeni widząc, że wyjście z tego programu:Ile liczb losowych używa 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;
}
jest 0
- tj std::uniform_real_distribution
wykorzystuje dwa liczb losowych w celu uzyskania losowego double
wartość w przedziale [0,1). Myślałem, że to po prostu wygeneruje i zmieni to. Po pomyśleniu o tym myślę, że to dlatego, że std::mt19937
wytwarza 32-bitowe ints, a podwójne jest dwa razy większe i tym samym nie jest "przypadkiem wystarczającym".
Pytanie: Jak mogę uzyskać ogólną liczbę, tzn. Czy generator liczb losowych i zmiennoprzecinkowych są typami arbitralnymi?
Edycja: Właśnie zauważyłem, że mogę użyć zamiast tego std::generate_canonical
, ponieważ interesują mnie tylko losowe liczby [0,1]. Nie jestem pewien, czy to robi różnicę.
Nie możesz tego znaleźć w sposób ogólny. –
@ R.MartinhoFernandes: ponieważ ... – arne
Pomyśl o tym, co oznaczałoby "przeskalowanie" 32-bitowej liczby całkowitej do 64-bitowego double: istnieje około 2^62 różnych podwójnych wartości. Jest 2 32 różnych wartości int. Oznacza to, że tylko ** jeden z każdego miliarda ** możliwych podwójnych wartości byłby reprezentowany w wynikowym podwójnym. Jest to wyraźnie niedopuszczalne. – JohannesD