Beispiel #1
0
/**
 * 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);
}
Beispiel #2
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 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;
}
Beispiel #3
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;
   }
}
Beispiel #4
0
/**
 *  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;
    }
}
Beispiel #5
0
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;
}
Beispiel #6
0
/**
 *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);
}