Próbuję przetłumaczyć część kodu Pythona na C++. To, co robi kod, to uruchomienie symulacji Monte Carlo. Myślałem, że wyniki z Pythona i C++ mogą być bardzo bliskie, ale wydaje się, że stało się coś śmiesznego.Różnica między generowaniem liczb losowych C++ a Pythonem
Oto co mam zrobić w Pythonie:
self.__length = 100
self.__monte_carlo_array=np.random.uniform(0.0, 1.0, self.__length)
Oto co mam zrobić w C++:
int length = 100;
std::random_device rd;
std::mt19937_64 mt(rd());
std::uniform_real_distribution<double> distribution(0, 1);
for(int i = 0; i < length; i++)
{
double d = distribution(mt);
monte_carlo_array[i] = d;
}
Pobiegłem powyżej generowania liczb losowych 100x5 razy zarówno w Pythonie i C++, a następnie do symulacji monte carlo z tymi liczbami losowymi.
W symulacji Monte carlo ustawiam próg na 0,5, dzięki czemu mogę z łatwością sprawdzić, czy wyniki są równomiernie rozłożone.
Oto koncepcyjny projekt, co robi symulacji Monte Carlo:
for(i = 0; i < length; i++)
{
if(monte_carlo_array[i] > threshold) // threshold = 0.5
monte_carlo_output[i] = 1;
else
monte_carlo_output[i] = 0;
}
Od długości tablicy jest Monte Carlo 120, I spodziewać się 60 1
s zarówno w Pythonie i C++. Obliczyłem średnią liczbę 1
s i odkryłem, że chociaż średnia liczba w C++ i Pythonie wynosi około 60, ale trend jest silnie skorelowany. Ponadto średnia liczba w Pythonie to zawsze wyższa niż w C++.
Czy mogę wiedzieć, czy to dlatego, że zrobiłem coś złego, czy jest to po prostu różnica między mechanizmami generowania losowego w C++ i Pythonie?
[edytuj] Należy pamiętać, że RNG in Python jest również Mersenne Twister 19937.
Różne generatory liczb losowych dają różne zestawy liczb losowych. Spodziewałbym się, że jeśli uruchomisz go kilka razy (jak setki razy), dostrzeżesz mniej oczywistą różnicę. –
Czy to naprawdę widać z kodu, który wyświetlasz? Muszą być inne wejścia, w przeciwnym razie nie byłoby żadnej korelacji między kodami! Podejrzewam, że błąd jest gdzie indziej ... –
Te szwy wyników zmanipulowane ... –