C/C 구현 Random 함수


#define A 16807L        /* multiplier (7**5) */
#define M 2147483647L   /* module (2**1-1) */

static long ln[16] = {0L,
            1973272912L, 747177549L, 20464843L, 640830765L, 1098742207L,
            78126602L, 84743774L, 831312807L, 124667236L, 1172177002L,
            1124933064L, 1223960546L, 1878892440L, 1449793615L, 553303732L};

static int strm = 1;        /* index of current stream */

/*-------------------------------------------------------------------*/
/* This implementation is for Intel 8086/8 and 80286/386 CPUs using  */
/* C compilers with 16-bit short integers and 32-bit long inegers.   */
/*-------------------------------------------------------------------*/
double ranf()
{
    short *p,*q,k;
    long Hi,Lo;
    p=(short *)&ln[strm];
    Hi=*(p+1) *A;
    *(p+1) = 0;
    Lo=ln[strm]*A;
    p=(short *)&Lo;
    Hi+= *(p+1);
    q=(short *)&Hi;
    *(p+1) = *q&0X7FFF;
    k= *(q+1) << 1;
    if(*q&0X7FFF) k++;
    Lo-=M;
    Lo+=k;
    if(Lo<0) Lo+=M;
    ln[strm]=Lo;
    return (double)Lo*4.656612875E-10;
}


보너스.
exponential random variables과 geometric random variables 생성 함수.
double expntl(double ramda)
{
    return (-log(1-ranf())/ramda);
}

int geometric(double p)
{
    if (p > 1.0 || p <= 0.0)
    {
        printf("invalid number of parameter p(%lf)\n", p);
        return 0;
    }
    return (int)((log(1.0 - ranf())/log(1.0 - p)) + 1);
}


이 글에는 0 개의 댓글이 있습니다.