/** * Generate Gauss distributed random numbers * http://moby.ihme.washington.edu/bradbell/mat2cpp/randn.cpp.xml * * Parameters: * r [out] random number array * n [in] data number * mean [in] gauss mean * sd [in] gauss stander diff * rseed [in] seed number, get ride of fist rseed random number */ void RandomGauss(double *r, int n, double mean, double sd, int rseed) { int i, j, k, nd; double *rr; double square, amp, angle; nd = n+2; rr = (double*) malloc(sizeof(double)*nd); RandomClose(rr, nd, rseed); k = 0; for(i = 0; i < n; i++) { if( k % 2 == 0 ) { square = - 2. * log( rr[k] ); if( square < 0. ) square = 0.; amp = sqrt(square); angle = 2. * M_PI * rr[k+1]; r[i] = amp * sin( angle ); } else r[i] = amp * cos( angle ); k++; } free(rr); }
/** * Generate a random array [-1:1] * * Parameters: * r [out] random array * n [in] random data numbers * rseed [in] discard random data numbers * * Return value: * None * */ void RandomBoth(double *r, int n, int rseed) { int i; //[0:1] RandomClose(r,n,rseed); //[0:1] -> [-1:1] for(i=0;i<n;i++) r[i] = 2*r[i] - 1.0; }
/** * Generate a random array (-1:1) * * Parameters: * r [out] random array * n [in] random data numbers * rseed [in] discard random data numbers * * Return value: * None * */ void RandomBothOpen(double *r,int n,int rseed) { int i; RandomClose(r,n,rseed); for(i=0;i<n;i++){ r[i]=2*r[i]-1.0; if(r[i]==1) r[i]=0.99999999; if(r[i]==-1) r[i]=-0.99999999; } }
/** * Generate a random array (0:1) * * Parameters: * r [out] random array * n [in] random data numbers * rseed [in] discard random data numbers * * Return value: * None * */ void RandomOpen(double *r,int n,int rseed) { int i; RandomClose(r,n,rseed); for(i=0; i<n; i++){ if(r[i] == 0) r[i] = 1.0e-5; if(r[i] == 1) r[i] = 0.99999; } }
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: RandomInit(); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: RandomClose(); break; } return TRUE; }
/** *Generate Gauss distributed random numbers * * Parameters: * r [out] random number array * n [in] data number * mean [in] gauss mean * sd [in] gauss stander diff * rseed [in] seed number, get ride of fist rseed random number */ void RandomGauss_(double *r, int n, double mean, double sd, int rseed) { int k, i, j, nd; double sum, *rr; k = 6; nd = n+k-1; rr = (double*) malloc(sizeof(double)*nd); RandomClose(rr, nd, rseed); for(i=0; i<=nd-k; i++){ sum=0; for(j=i; j<i+k; j++) sum += rr[j]; sum /= k; rr[i] = (sum-0.5)/sqrt(1.0/(12.0*k))*sd + mean; } for(i=0; i<n; i++) r[i] = rr[i]; free(rr); }