c++ - C++随机数生成与Python的区别

标签 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,这样我可以很容易地验证结果是否均匀分布。

这是蒙特卡洛模拟所做的概念草案:

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,我希望在 Python 和 C++ 中看到 60 个 1。我计算了1的平均数,发现虽然C++和Python的平均数在60左右,但是趋势是高度相关的。此外,Python 中的平均数总是高于 C++。

distribution chart 请问这是因为我做错了什么,还是仅仅是因为 C++ 和 Python 中随机生成机制的不同?

[编辑] 请注意 RNG in Python也是 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

总而言之,就“0.5 左右的统一程度”而言,我认为 C++ 和 Python 中的随机数实现之间没有任何巨大差异。但是我并没有太多地研究统计数据(那是很多年前的事了)。

关于c++ - C++随机数生成与Python的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18184489/

相关文章:

c++ - 我如何存储和获取结构队列?

c++ - 如何在 C++ 中以浮点/ double 值表示无穷大?

Python - 从 numpy 表创建字典以显示列表

c++ - 使用递归C++打印出模式

c++ - 尝试关闭 OpenCV 窗口无效

python - 从 pandas 数据框中提取 4 位数字列名

python - 打印中调用函数 ("""""")

python - 从 numpy ndarray 中高效采样向量

python - 在python中生成一个随机的非质数

python - 并行过程的最佳种子