[英]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中隨機生成機制的區別?
我根據發布的代碼寫了這個:
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.