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