// generates a random allele frequency in 1/i scaled by alpha // bounded by the number of copies at the locus int random_allele_frequency(int copies, double alpha) { return min((int) floor(1 / genrand_real1() * alpha), copies); }
void parameter_generation(double parameter[], double ref_parameter[]) { double unit_r, exponent; int i; /* [0,1] 単位乱数を用意する */ unit_r = genrand_real1(); /* [0,10] の乱数に変換 */ exponent = 10.0*unit_r; /* ランダムな値をログスケールで発生させる */ parameter[0] = 1.0e-6*pow(10.0, exponent); /* [0,1] 単位乱数を用意する */ unit_r = genrand_real1(); /* [0,10] の乱数に変換 */ exponent = 10.0*unit_r; /* ランダムな値をログスケールで発生させる */ parameter[1] = 1.0e-6*pow(10.0, exponent); /* [0,1] 単位乱数を用意する */ unit_r = genrand_real1(); /* [0,10] の乱数に変換 */ exponent = 10.0*unit_r; /* ランダムな値をログスケールで発生させる */ parameter[2] = 1.0e-6*pow(10.0, exponent); /* [0,1] 単位乱数を用意する */ unit_r = genrand_real1(); /* [0,10] の乱数に変換 */ exponent = 10.0*unit_r; /* ランダムな値をログスケールで発生させる */ parameter[3] = 1.0e-6*pow(10.0, exponent); /* [0,1] 単位乱数を用意する */ unit_r = genrand_real1(); /* [0,10] の乱数に変換 */ exponent = 10.0*unit_r; /* ランダムな値をログスケールで発生させる */ parameter[12] = 1.0e-6*pow(10.0, exponent); /* [0,1] 単位乱数を用意する */ unit_r = genrand_real1(); /* [0,10] の乱数に変換 */ exponent = 10.0*unit_r; /* ランダムな値をログスケールで発生させる */ parameter[13] = 1.0e-6*pow(10.0, exponent); /* [0,1] 単位乱数を用意する */ unit_r = genrand_real1(); /* [0,10] の乱数に変換 */ exponent = 10.0*unit_r; /* ランダムな値をログスケールで発生させる */ parameter[14] = 1.0e-6*pow(10.0, exponent); /* [0,1] 単位乱数を用意する */ unit_r = genrand_real1(); /* [0,10] の乱数に変換 */ exponent = 10.0*unit_r; /* ランダムな値をログスケールで発生させる */ parameter[15] = 1.0e-6*pow(10.0, exponent); }
int expovariate(double lambda) { return -log(genrand_real1()) / lambda; }
int main (int argc, char* argv[]) { float mean, var, range, a, b, *dat; size_t nbuf, nsiz; int seed; size_t i; bool normal, rep; sf_file in, out; sf_init (argc,argv); in = sf_input ("in"); out = sf_output("out"); if (SF_FLOAT != sf_gettype(in)) sf_error("Need float input"); if (!sf_getint("seed",&seed)) seed = time(NULL); /* random seed */ init_genrand((unsigned long) seed); if (!sf_getbool("type",&normal)) normal=true; /* noise distribution, y: normal, n: uniform */ if (!sf_getfloat("var",&var)) { /* noise variance */ if (!sf_getfloat("range",&range)) { /* noise range (default=1) */ a = 1.; } else { a = normal? 2.*range/9. : 2.*range; } } else { a = normal? sqrtf(var): sqrtf(12*var); } if (!sf_getfloat("mean",&mean)) mean=0; /* noise mean */ b = normal? mean: mean - 0.5*a; if (!sf_getbool("rep",&rep)) rep=false; /* if y, replace data with noise */ nbuf = BUFSIZ/sizeof(float); dat = sf_floatalloc (nbuf); for (nsiz = sf_filesize(in); nsiz > 0; nsiz -= nbuf) { if (nbuf > nsiz) nbuf = nsiz; if (rep) { if (normal) { for (i=0; i < nbuf; i++) { dat[i] = a*sf_randn_one_bm() + b; } } else { for (i=0; i < nbuf; i++) { dat[i] = a*genrand_real1() + b; } } } else { sf_floatread(dat,nbuf,in); if (normal) { for (i=0; i < nbuf; i++) { dat[i] += a*sf_randn_one_bm() + b; } } else { for (i=0; i < nbuf; i++) { dat[i] += a*genrand_real1() + b; } } } sf_floatwrite(dat,nbuf,out); } exit(0); }