Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 正态随机发生器_C_Random_Openmp_Gaussian - Fatal编程技术网

C 正态随机发生器

C 正态随机发生器,c,random,openmp,gaussian,C,Random,Openmp,Gaussian,我在做一个并行计算的C任务,在这里我必须使用Box-Muller变换实现一些Monte Carlo模拟,使用有效的胎面安全正态随机发生器。我生成2个均匀随机数X和Y的向量,条件是X在(0,1)中,Y在[0,1]中。 但我不确定我从半开区间(0,1)中抽取均匀随机数的方法是否正确。 有人遇到过类似的事情吗? 我正在使用以下代码: double* StandardNormalRandom(long int N){ double *X = NULL, *Y = NULL, *U = NULL;

我在做一个并行计算的C任务,在这里我必须使用Box-Muller变换实现一些Monte Carlo模拟,使用有效的胎面安全正态随机发生器。我生成2个均匀随机数X和Y的向量,条件是X在(0,1)中,Y在[0,1]中。 但我不确定我从半开区间(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;
    }
double*StandardNormalRandom(长整数N){
双精度*X=NULL,*Y=NULL,*U=NULL;
X=vUniformRandom_0(N/2);
Y=vUniformRandom(N/2);
#pragma-omp并行

对于
StandardNormalRandom
函数中的(i=0;i),我将假定指针
U
已分配给大小
N
,在这种情况下,我认为该函数很好。 以及函数
NormalRandom

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


希望有帮助!

这不是问题,我在第一次执行线程时初始化I[j],并根据我以前生成的随机数数组为它赋值。@当然可以,你能用缺少的代码编辑你的问题吗?人们会更容易帮助你。
#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);