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;
}
Python と C++ の両方で乱数生成を 100x5 回以上実行し、これらの乱数を使用してモンテカルロ シミュレーションを実行しました。
モンテカルロ シミュレーションでは、しきい値を 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 であるため1
、Python と C++ の両方で 60 が表示されると予想されます。の平均数を計算した1
ところ、C++ と Python の平均数は約 60 ですが、傾向は非常に相関していることがわかりました。さらに、Python の平均数は常にC++ よりも高くなっています。
これは私が何か間違ったことをしたからなのか、それとも単に C++ と Python のランダム生成メカニズムの違いが原因なのか分かりますか?
[編集] Python の RNGは Mersenne Twister 19937 でもあることに注意してください。