Napisałem mały kod, aby upewnić się, że mogę uzyskać losowe liczby z naprawdę szerokiego zakresu, np. [0, 10^36), ponieważ zamierzam wykorzystać te szerokie zakresy później.Losowe liczby generowane przy użyciu jednolitej rzeczywistej dystrybucji w C++ nie są tak naprawdę rozproszone.
Mój kod wygląda następująco:
#include <iostream>
#include <cmath>
#include <random>
#include <chrono>
int main()
{ unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
double expo = pow(10,36);
std::uniform_real_distribution<double> dist(0,expo);
std::mt19937_64 rng(seed);
for (int i=0; i<10; i++)
std::cout << dist(rng) << std::endl;
return 0;
}
I Oto przykład wyjścia:
6.75507e+035
4.01129e+035
6.85525e+035
8.85896e+035
3.1455e+035
3.04962e+035
5.48817e+035
3.54502e+035
2.24337e+035
2.23367e+035
Jak widać, liczby losowe są naprawdę blisko górnego punktu końcowego danego przedziału. Próbowałem wielokrotnie uruchamiać program, zwiększałem również 10 liczb do 100, ale losowe liczby zawsze były zbliżone do górnego punktu końcowego przedziału (z wykładnikiem 35, a czasami 34).
Ponieważ używam std::uniform_real_distribution
, spodziewam się mieć również, a czasami numery w zakresie [0, 1000] na przykład. Nie uważam tego za jednolitą dystrybucję. To jest dla mnie ważne, że liczba losowa nie jest blisko tylko do górnego punktu końcowego, ponieważ mam zamiar użyć liczby losowej później w if-oświadczenie:
if (random_number == 0)
//do some operations
a górny punkt końcowy zostanie faktycznie użyty jako stawka, w której coś się pojawia. Wydaje się jednak, że liczba losowa nie ma czasami szansy na zero.
Nie wiem, dlaczego tak się dzieje i naprawdę doceniam każdy pomysł lub pomoc.
(Eclipse 4.4.1, Windows 7)
Jeśli 'std :: uniform_real_distribution dist (0,1000) (rng)' zwraca (dokładnie) 1000.0, to jest błąd w implementacji i należy go zgłosić, ponieważ interwał ma być w połowie zamknięty : '[0, 1000)'. Zwrot 0 jest możliwy, ale prawdopodobieństwo jest mikroskopijne, prawdopodobnie mniejsze niż jeden w kwadrylionie. –
rici