gpt4 book ai didi

c++ - mt19937 生成的重复值

转载 作者:行者123 更新时间:2023-11-28 03:18:58 24 4
gpt4 key购买 nike

我正在使用 C++11 的 random 库,我有一个小程序可以在具有单位半径的圆上生成坐标对 x, y。这是简单的多线程程序

#include <iostream>
#include <fstream>
#include <random>

using namespace std;



int main()
{
const double PI = 3.1415;



double angle, radius, X, Y;
int i;
vector<double> finalPositionX, finalPositionY;

#pragma omp parallel
{
vector <double> positionX, positionY;

mt19937 engine(0);
uniform_real_distribution<> uniform(0, 1);
normal_distribution<double> normal(0, 1);



#pragma omp for private(angle, radius, X, Y)
for(i=0; i<1000000; ++i)
{
angle = uniform(engine)*2.0*PI;
radius = sqrt(uniform(engine));
X = radius*cos(angle);
Y = radius*sin(angle);

positionX.push_back(X);
positionY.push_back(Y);
}
#pragma omp barrier

#pragma omp critical
finalPositionX.insert(finalPositionX.end(), positionX.begin(), positionX.end());
finalPositionY.insert(finalPositionY.end(), positionY.begin(), positionY.end());
}


ofstream output_data("positions.txt", ios::out);
output_data.precision(9);
for(unsigned long long temp_var=0; temp_var<(unsigned long long)finalPositionX.size(); temp_var++)
{
output_data << finalPositionX[temp_var]
<< "\t\t\t\t"
<< finalPositionY[temp_var]
<< "\n";
}
output_data.close();
return 0;
}

问题:许多 x 坐标出现两次(与 y 坐标相同)。我不明白这一点,因为 mt19937 的周期比 1.000.000 长得多。有谁知道这里出了什么问题?

注意:当我不对应用程序进行多线程处理时,我会遇到相同的行为,因此问题与错误的多线程处理无关。

编辑 正如其中一个答案所指出的,我不应该为两个线程使用相同的种子 - 但这是我在制定这个问题时犯的一个错误,在我的真实程序中我似乎线程不同。

最佳答案

使用您代码的核心部分,我编写了这个不完美的测试,但据我所知,分布非常均匀:

#include <iostream>
#include <fstream>
#include <random>
#include <map>
#include <iomanip>

using namespace std;

int main()
{
int i;
vector<double> finalPositionX, finalPositionY;
std::map<int, int> hist;


vector <double> positionX, positionY;

mt19937 engine(0);
uniform_real_distribution<> uniform(0, 1);
//normal_distribution<double> normal(0, 1);
for(i=0; i<1000000; ++i)
{
double rnum = uniform(engine);

++hist[std::round(1000*rnum)];

}

for (auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*') << '\n';
}

return 0;
}

正如其他人所说,看到某些值重复并不意外。对于 normal 分布,我使用了以下对 rnumhist 的修改来测试它,它看起来也不错:

double rnum = normal(engine);                  
++hist[std::round(10*rnum)];

关于c++ - mt19937 生成的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16016432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com