double *SampleGauss(gauss_t *mp) { int i,j; double *v,*aux; nonull(v=malloc(mp->dim*sizeof(double))); nonull(aux=malloc(mp->dim*sizeof(double))); for (i=0; i<mp->dim; i++) aux[i]=BoxMuller(); for (i=0; i<mp->dim; i++) v[i]=mp->mean[i]; if (mp->type==DIAG) for (i=0; i<mp->dim; i++) v[i]+=mp->dCholesky[i]*aux[i]; else { for (i=0; i<mp->dim; i++) for (j=0; j<=i; j++) v[i]+=mp->Cholesky[i][j]*aux[j]; } free(aux); return v; }
extern "C" void BoxMullerRef(float *h_Random, int NPerRng){ int i; for(i = 0; i < MT_RNG_COUNT * NPerRng; i += 2) BoxMuller(h_Random[i + 0], h_Random[i + 1]); }
double RNG::nextGaussian() { return BoxMuller(nextUnif(), nextUnif()); }