9

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 でもあることに注意してください。

4

2 に答える 2

5

投稿されたコードに基づいてこれを書きました:

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

5 回実行すると、次の結果が得られます。

Python:
480
507
485
515
506
average:
498.6

C++:
499
484
531
509
509
average
506.4

したがって、C++ は python よりも優れていることがわかりました。しかし、それは「少数のサンプルで乱数が均一に分布していない」場合だと思います。

代わりに長さを 100000 に変更しましたが、それでも結果は 50k あたりで上下に変化します。

Python:

50235
49752
50215
49717
49974

Average: 
49978.6

C++:

50085
50018
49993
49779
49966

Average:
49968.2

要約すると、C++ と Python の乱数の実装に「0.5 前後でどれだけ均一か」という点で大きな違いはないと思います。しかし、私は統計学をあまり勉強したことがありません (何年も前のことです)。

于 2013-08-12T11:15:51.493 に答える