0
我正在爲並行計算做一個C分配,在那裏我必須使用Box-Muller變換實現某種蒙特卡洛模擬,其中包括高效的胎面安全正態隨機發生器。我生成2個統一的隨機數X和Y的向量,其條件是X在(0,1]和Y在[0,1]中。但我不確定我是如何從半開始間隔(0,1]是正確 有沒有人遇到類似 我用下面的代碼的東西:?OpenMP C正態隨機發生器
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);
這不是問題,我在線程的第一次執行時初始化I [j],並從之前生成的隨機數組中給它賦值。 – Suren
@Suren好的,你可以用缺少的代碼編輯你的問題。人們會更容易幫助你。 –
好的,沒問題! – Suren