OpenMP C普通随机生成器

时间:2014-01-09 00:50:52

标签: c random openmp gaussian

我正在为并行计算做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);

1 个答案:

答案 0 :(得分:0)

StandardNormalRandom函数中,我将假设指针U已分配给大小N,在这种情况下,此函数对我来说很好。 以及函数NormalRandom

但是对于函数UniformRandom(缺少某些部分,所以我必须假设一些东西),如果以下行I[j] = (a*I[j - 1] + c) % m + 1;是一个{{1}的循环体那么你会遇到一些问题。由于您无法知道线程的执行顺序,因此当前线程(具有固定值omp parallel for)不能依赖j的值,因为此值可以在任何位置修改时间(默认情况下应共享I[j - 1])。

希望它有所帮助!