/** * Normalized random number * FIXME: if the input n is short, it random will be not correct * * http://moby.ihme.washington.edu/bradbell/mat2cpp/randn.cpp.xml * * Parameters: * \param[out] r random number array * \param[in] n length * \param[in] mean mean value * \param[in] sd sigma * \param[in] d random handle * Return Value: * None */ void randn(double *r, int n, double mean, double sd, void *d) { int i, j, k, nd; double *rr; double square, amp, angle; nd = n+2; rr = (double*) malloc(sizeof(double)*nd); rand_o0c1(rr, nd, d); 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); }
void random(std::vector<double> &r, int n, void *d) { double *p; r.resize(n); p = &(r[0]); rand_o0c1(p, n, d); }
void rand_o0c1(double *r, int n, void *d) { if( n >= DSFMT_N64 ) { int nn; if( n % 2 != 0 ) nn = n - 1; else nn = n; if( d == NULL ) { dsfmt_fill_array_open_close(&dsfmt_global_data, r, nn); } else { dsfmt_t *p = (dsfmt_t*) d; dsfmt_fill_array_open_close(p, r, nn); } if( n % 2 != 0 ) r[n-1] = rand_o0c1(d); } else { for(int i=0; i<n; i++) r[i] = rand_o0c1(d); } }
/** * Generate random permutation * * Parameters: * \param[out] r random permutation * \param[in] n array size */ void randperm(int *r, int n, void *d) { int i; double *da; da = new double[n]; for(i=0; i<n; i++) r[i] = i; rand_o0c1(da, n, d); quick_sort_di(da, r, 0, n-1); delete [] da; }
/** * Normalized random number * FIXME: if the input n is short, it random will be not correct * * Parameters: * \param[out] r random number array * \param[in] n length * \param[in] mean mean value * \param[in] sd sigma * \param[in] d random handle * Return Value: * None */ void randn_(double *r, int n, double mean, double sd, void *d) { int k, i, j, nd; double sum, *rr; k = 6; nd = n+k-1; rr = (double*) malloc(sizeof(double)*nd); rand_o0c1(rr, nd, d); 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); }
void random(double *r, int n, void *d) { rand_o0c1(r, n, d); }
double rand_d(void *d) { return rand_o0c1(d); }