我正在为并行计算做C分配,我必须使用Box-Muller变换实现某种蒙特卡罗模拟和高效胎面安全正常随机发生器。我生成2个均匀随机数X和Y的向量,条件是(0,1)中的X和[0,1]中的Y. 但我不确定从半开区间(0,1)采样均匀随机数的方式是正确的。 有没有人遇到类似的东西? 我正在使用以下代码:
double* StandardNormalRandom(long int N){
double *X = NULL, *Y = NULL, *U = NULL;
X = vUniformRandom_0(N / 2);
Y = vUniformRandom(N / 2);
#pragma omp parallel for
for (i = 0; i<N/2; i++){
U[2*i] = sqrt(-2 * log(X[i]))*sin(Y[i] * 2 * pi);
U[2*i + 1] = sqrt(-2 * log(X[i]))*cos(Y[i] * 2 * pi);
}
return U;
}
double* NormalRandom(long int N, double mu, double sigma2)
{
double *U = NULL, stdev = sqrt(sigma2);
U = StandardNormalRandom(N);
#pragma omp parallel for
for (int i = 0; i < N; i++) U[i] = mu + stdev*U[i];
return U;
}
这里我的UniformRandom函数的位也是并行实现的:
#pragma omp parallel for firstprivate(i)
for (long int j = 0; j < N;j++)
{
if (i == 0){
int tn = omp_get_thread_num();
I[tn] = S[tn];
i++;
}
else
{
I[j] = (a*I[j - 1] + c) % m;
}
}
}
#pragma omp parallel for
for (long int j = 0; j < N; j++)
U[j] = (double)I[j] / (m+1.0);
答案 0 :(得分:0)
在StandardNormalRandom
函数中,我将假设指针U
已分配给大小N
,在这种情况下,此函数对我来说很好。
以及函数NormalRandom
。
但是对于函数UniformRandom
(缺少某些部分,所以我必须假设一些东西),如果以下行I[j] = (a*I[j - 1] + c) % m + 1;
是一个{{1}的循环体那么你会遇到一些问题。由于您无法知道线程的执行顺序,因此当前线程(具有固定值omp parallel for
)不能依赖j
的值,因为此值可以在任何位置修改时间(默认情况下应共享I[j - 1]
)。
希望它有所帮助!