Exemple #1
0
/**
 *  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);
}
Exemple #2
0
void random(std::vector<double> &r, int n, void *d)
{
    double  *p;

    r.resize(n);
    p = &(r[0]);
    rand_o0c1(p, n, d);
}
Exemple #3
0
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);
    }
}
Exemple #4
0
/**
 *  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;
}
Exemple #5
0
/**
 *  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);
}
Exemple #6
0
void random(double *r, int n, void *d)
{
    rand_o0c1(r, n, d);
}
Exemple #7
0
double rand_d(void *d)
{
    return rand_o0c1(d);
}