2013-07-22 17 views
6

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ę.

+0

Nie możesz tego znaleźć w sposób ogólny. –

+2

@ R.MartinhoFernandes: ponieważ ... – arne

+1

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

Odpowiedz

2

Na template<class RealType, size_t bits, class URNG> std::generate_canonical standardowe (rozdział 27.5.7.2) jednoznacznie określa liczbę połączeń do jednolitego generator liczb losowych (URNG) jest

max (1, b/log_2 R)

gdzie b to minimalna liczba bitów w mantysie typu RealType i liczba bitów podanych jako parametr_konkurencyjny jako parametr szablonu. R to zakres numerów, które URNG może zwrócić (URNG::max()-URNG::min()+1). Jednak w twoim przykładzie nie będzie to miało żadnego znaczenia, ponieważ potrzebujesz 2 wywołań do mt19937, aby wypełnić 53 bity mantysy podwójnej.

W przypadku innych dystrybucji standard nie zapewnia ogólnego sposobu uzyskania informacji o liczbie numerów, które URNG musi wygenerować, aby uzyskać jeden numer dystrybucji.

Przyczyną może być to, że w przypadku niektórych dystrybucji liczba jednolitych liczb losowych wymaganych do wygenerowania pojedynczego numeru dystrybucji nie jest stała i może różnić się w zależności od połączenia. Przykładem jest std::poisson_distribution, który jest zwykle zaimplementowany jako pętla, która rysuje jednolitą liczbę losową w każdej iteracji, aż iloczyn tych liczb osiągnie określony próg (patrz na przykład implementation of the GNU C++ library (wiersz 1523-1528)).

Powiązane problemy