我正在使用 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 长得多。有谁知道这里有什么问题?
注意:当我不对应用程序进行多线程处理时,我会得到相同的行为,因此问题与错误的多线程处理无关。
编辑正如其中一个答案所指出的,我不应该对两个线程使用相同的种子 - 但这是我在制定这个问题时犯的一个错误,在我的实际程序中,我似乎线程不同。