C ++随机数生成与Python之间的区别

时间:2013-08-12 10:15:15

标签: c++ python random montecarlo

我正在尝试将一些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的平均数,发现虽然C ++和Python中的平均数约为60,但趋势高度相关。此外,Python中的平均数总是高于

distribution chart 我是否知道这是因为我做错了什么,还是仅仅因为C ++中的随机生成机制与Python之间存在差异?

[编辑] 请注意,RNG in Python也是Mersenne Twister 19937。

2 个答案:

答案 0 :(得分: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;
}

每次运行五次:

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左右”之间没有任何巨大差异。但我并没有非常研究统计数据(而且很多年前)。

答案 1 :(得分:0)

当您不确定随机数时,只需使用Random ORG等服务生成大量随机数。之后,在两个实现(C ++和Python)中将此数字作为数组提供。通过这种方式,您将确保两个程序使用相同的随机数集,并且您将能够确认其余代码是否正常。