簡體   English   中英

C ++隨機數生成與Python之間的區別

[英]Difference between C++ random number generation and 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;
}

我在Python和C ++中以100x5的隨機數運行,然后使用這些隨機數進行蒙特卡羅模擬。

在蒙特卡羅模擬中,我將閾值設置為0.5,因此我可以輕松驗證結果是否均勻分布。

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

由於monte carlo數組的長度是120,我希望在Python和C ++中看到60 1 s。 我計算了1 s的平均數,發現盡管C ++和Python中的平均數約為60,但趨勢高度相關。 而且,Python中的平均數總是高於 C ++。

分布圖 我是否知道這是因為我做錯了什么,還是因為C ++和Python中隨機生成機制的區別?

[編輯]請注意, Python中的RNG也是Mersenne Twister 19937。

我根據發布的代碼寫了這個:

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,結果仍然在50k左右變化:

Python:

50235
49752
50215
49717
49974

Average: 
49978.6

C++:

50085
50018
49993
49779
49966

Average:
49968.2

總而言之,我認為C ++和Python中的隨機數實現在“它的均勻性大約為0.5”時有什么不同。 但我並沒有非常研究統計數據(而且很多年前)。

當您不確定隨機數時,只需使用隨機ORG等服務生成大量隨機數。 之后,在兩個實現(C ++和Python)中將此數字作為數組提供。 通過這種方式,您將確保兩個程序使用相同的隨機數集,並且您將能夠確認其余代碼是否正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM