pmmlcg.c

来自「speech signal process tools」· C语言 代码 · 共 88 行

C
88
字号
/*      name : pmmlcg.c      by:    Jonathan G. Fiscus      For:   605.412 Fall 1990      This set of routines below implement a PMMLCG linear conguential random      number generator given the following formula               5                    31      Z   =   7  *  Z          mod 2  -1       i             (i-1)*/#include <util/utillib.h>static int random_seed = 1;static int a=16807;static int m=0x7fffffff;static int q=127773;static int r=2836;void init_seed(int new_seed, int verbose){    random_seed = new_seed;    if (verbose){        printf("PMMLCG Initializing\n\n");        printf("PMMLCG Parameters:\n");        printf("    seed: %d\n",random_seed);        printf("       a: %d\n",a);        printf("       m: %d (%x)\n",m,m);        printf("       q: %d\n",q);        printf("       r: %d\n\n",r);    }}float pmmlcg(void){    int lo, hi, test;    hi = random_seed / q;    lo = random_seed % q;    test = (a*lo) - (r*hi);    if (test > 0)        random_seed = test;    else        random_seed = test + m;    return((float)random_seed/(float)m);}int pmmlcg_newseed(void){    pmmlcg();    return(random_seed);}int pmmlcg_seed(void){    return(random_seed);}float exp_dist(float beta){    return(-(beta*log(pmmlcg())));}float M_erlang(float beta, int M){    float product=1.0;    int i;    for (i=0; i<M; i++)        product *= pmmlcg();    return(-(beta/(float)M) * log(product));}int arbitrary_discrete_rv(float *prob_list, int num_prob){    float value;    int i;    value = pmmlcg();    for (i=0; i<num_prob; i++)        if (value <= prob_list[i])            return(i);    return(num_prob-1);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?