#include "my.h" /* pick2() */ int pick2(n,i,j) int n, *i, *j; { double ran1(); *i = n * ran1() ; while( ( *j = n * ran1() ) == *i ) ; return(0) ; } /**** ordran.c ***/ int ordran(n,pbuf) int n; double pbuf[]; { ranvec(n,pbuf); order(n,pbuf); return; } int mnmial(n,nclass,p,rv) int n, nclass, rv[]; double p[]; { double ran1(); double x, s; int i, j; for(i=0; i s) && ( j<(nclass-1) ) ) s += p[++j]; rv[j]++; } return(j); } int order(n,pbuf) int n; double pbuf[]; { int gap, i, j; double temp; for( gap= n/2; gap>0; gap /= 2) for( i=gap; i=0 && pbuf[j]>pbuf[j+gap]; j -=gap) { temp = pbuf[j]; pbuf[j] = pbuf[j+gap]; pbuf[j+gap] = temp; } } int ranvec(n,pbuf) int n; double pbuf[]; { int i; double ran1(); for(i=0; i 30. ) return( (int)(0.5 + gasdev(u,u)) ); ru = ran1(); p = exp(-u); if( ru < p) return(0); cump = p; while( ru > ( cump += (p *= u/i ) ) ) i++; return(i); } /* a slight modification of crecipes version */ double gasdev(m,v) double m, v; { static int iset=0; static float gset; float fac,r,v1,v2; double ran1(); if (iset == 0) { do { v1=2.0*ran1()-1.0; v2=2.0*ran1()-1.0; r=v1*v1+v2*v2; } while (r >= 1.0); fac=sqrt(-2.0*log(r)/r); gset= v1*fac; iset=1; return( m + sqrt(v)*v2*fac); } else { iset=0; return( m + sqrt(v)*gset ) ; } }