Разница между генерацией случайных чисел в C ++ и Python

Я пытаюсь перевести некоторый код Python на C ++. Что код делает, так это запускает симуляцию Монте-Карло. Я думал, что результаты Python и C ++ могут быть очень близки, но, кажется, произошло нечто забавное.

Вот что я делаю в Python:

self.__length = 100
self.__monte_carlo_array=np.random.uniform(0.0, 1.0, self.__length)

Вот что я делаю в 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;
}

Я бегал выше генерации случайных чисел 100×5 раз как в Python, так и в C ++, а затем выполнял симуляцию Монте-Карло с этими случайными числами.

В симуляции Монте-Карло я установил порог равным 0,5, поэтому я могу легко проверить, равномерно ли распределены результаты.

Вот концептуальный проект, который делает симуляция Монте-Карло:

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;
}

Поскольку длина массива Монте-Карло составляет 120, я ожидаю увидеть 60 1как в Python, так и в C ++. Я рассчитываю среднее количество 1s и обнаружили, что, хотя среднее число в C ++ и Python составляет около 60, но тенденция сильно коррелирует. Кроме того, среднее число в Python всегда выше чем в C ++.

схема распределения
Могу я узнать, потому что я сделал что-то не так или просто потому, что разница между механизмами случайной генерации в C ++ и Python?

[редактировать] Обратите внимание, что ГСЧ в Python также Mersenne Twister 19937.

9

Решение

Я написал это на основе размещенного кода:

import numpy as np

length = 1000
monte_carlo_array=np.random.uniform(0.0, 1.0, length)
# print monte_carlo_array
threshold = 0.5
above = 0

for i in range (0,length):
if monte_carlo_array[i] > threshold:
above+=1
print above

и это в C ++:

#include <random>
#include <iostream>

int main()
{
const int length = 1000;
std::random_device rd;
std::mt19937_64 mt(rd());
std::uniform_real_distribution<double> distribution(0, 1);
double threshold = 0.5;
double monte_carlo_array[length];

for(int i = 0; i < length; i++)
{
double d = distribution(mt);
monte_carlo_array[i] = d;
}
int above = 0;

for(int i = 0; i < length; i++)
{
if (monte_carlo_array[i] > threshold)
{
above++;
}
}
std::cout << above << std::endl;
}

Пять прогонов каждый дает:

Python:
480
507
485
515
506
average:
498.6

C++:
499
484
531
509
509
average
506.4

Так что, если что-то я нахожу, что C ++ выше, чем Python. Но я думаю, что это скорее случай «случайных чисел, распределенных неравномерно с небольшим количеством выборок».

Вместо этого я изменил длину на 100000, и все же результаты меняются в пределах 50К:

Python:

50235
49752
50215
49717
49974

Average:
49978.6

C++:

50085
50018
49993
49779
49966

Average:
49968.2

Таким образом, я не думаю, что есть какая-то огромная разница между реализациями случайных чисел в C ++ и Python, когда дело доходит до «насколько оно одинаково около 0,5». Но я не очень много изучал статистику (а это было много лет назад).

5

Другие решения

Когда вы не уверены в случайных числах, просто сгенерируйте огромное количество случайных чисел, используя сервис Случайная ORG. После этого укажите эти числа в виде массива в обеих реализациях (C ++ и Python). Таким образом вы будете уверены, что обе программы используют один и тот же набор случайных чисел, и вы сможете подтвердить, что с остальным кодом все в порядке.

0

По вопросам рекламы [email protected]