首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++随机数生成与Python的区别

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

Stack Overflow用户
提问于 2013-08-12 10:15:14
回答 2查看 2.9K关注 0票数 9

我正在尝试将一些python代码翻译成C++。代码所做的是运行蒙特卡罗模拟。我认为Python和C++的结果可能非常接近,但似乎发生了一些有趣的事情。

下面是我在Python中所做的工作:

代码语言:javascript
运行
复制
self.__length = 100
self.__monte_carlo_array=np.random.uniform(0.0, 1.0, self.__length)

下面是我在C++中所做的工作:

代码语言:javascript
运行
复制
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;
}

我在PythonandC++中运行了100×5次随机数生成,然后用这些随机数进行蒙特卡罗模拟。

在monte模拟中,我将阈值设置为0.5,这样就可以很容易地验证结果是否均匀分布。

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

代码语言:javascript
运行
复制
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数组的长度为120,我希望在Python和C++中都能看到60个C++。我计算了1的平均数量,发现虽然C++和Python的平均数量在60左右,但趋势是高度相关的。而且,Python中的平均数字是总是比C++高。

我是否可以知道这是因为我做错了什么,还是仅仅因为C++和Python中的随机生成机制之间的区别?

编辑请注意,Python中的RNG也是梅森扭动器19937。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-12 11:15:51

我是根据贴出的代码写的:

代码语言:javascript
运行
复制
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++中是:

代码语言:javascript
运行
复制
#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;
}

每跑五次就可以:

代码语言:javascript
运行
复制
Python:
480
507
485
515
506
average:
498.6

C++:
499
484
531
509
509
average
506.4

因此,我发现C++比python高。但我认为这更像是“随机数不是均匀分布在少量样本中”的情况。

我将长度改为100000,但结果仍然上下变化,大约在50K左右:

代码语言:javascript
运行
复制
Python:

50235
49752
50215
49717
49974

Average: 
49978.6

C++:

50085
50018
49993
49779
49966

Average:
49968.2

总之,我认为C++和Python中的随机数实现在“它有多均匀”时并没有太大的区别。但我对统计学研究不多(而且是很多年前的事了)。

票数 5
EN

Stack Overflow用户

发布于 2017-10-09 07:23:07

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18184489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档