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);
}


Retrieved from https://hyacinth.kr:443/moniwiki/wiki.php/C 구현 Random 함수
last modified 2013-04-03 17:36:38