void randirichlet(double *x, double *pp, int n) /** generate dirichlet r.v. parameters pp */ { double y ; int i ; for (i=0; i<n; i++) { x[i] = rangam(pp[i]) ; } bal1(x,n) ; }
void randirichlet(double *x, double *pp, int n) /** generate dirichlet r.v. parameters pp */ { int i ; vzero(x, n) ; for (i=0; i<n; i++) { if (pp[i] > 0.0) { x[i] = rangam(pp[i]) ; } } bal1(x,n) ; }
void ranmultinom(int *samp, int n, double *p, int len) // multinomial sample p is prob dist n samples returned // work is O(len^2) which is silly { int x ; double *pp ; if (len==0) return ; ivzero(samp, len) ; if (n<=0) return ; if (len==1) { samp[0] = n ; return ; } ZALLOC(pp, len, double) ; copyarr(p, pp, len) ; bal1(pp, len) ; samp[0] = x = ranbinom(n, pp[0]) ; ranmultinom(samp+1, n-x, p+1, len-1) ; free(pp) ; }