#define gb_next_rand() (*gb_flip_ptr>=0?*gb_flip_ptr--:gb_flip_cycle() ) \ #define two_to_the_31 ((unsigned long) 0x80000000) \ /*3:*/ #line 52 "gb_flip.w" /*4:*/ #line 70 "gb_flip.w" static long A[56]= {-1}; /*:4*/ #line 53 "gb_flip.w" /*5:*/ #line 82 "gb_flip.w" long*gb_flip_ptr= A; /*:5*/ #line 54 "gb_flip.w" /*7:*/ #line 117 "gb_flip.w" long gb_flip_cycle() {register long*ii,*jj; for(ii= &A[1],jj= &A[32];jj<=&A[55];ii++,jj++) *ii= (*ii-*jj)&0x7fffffff; for(jj= &A[1];ii<=&A[55];ii++,jj++) *ii= (*ii-*jj)&0x7fffffff; gb_flip_ptr= &A[54]; return A[55]; } /*:7*//*8:*/ #line 142 "gb_flip.w" void gb_init_rand(seed) long seed; {register int i; register long prev= seed,next= 1; seed= prev= prev&0x7fffffff; A[55]= prev; for(i= 21;i;i= (i+21)%55){ A[i]= next; /*9:*/ #line 174 "gb_flip.w" next= (prev-next)&0x7fffffff; if(seed&1)seed= 0x40000000+(seed>>1); else seed>>= 1; next= (next-seed)&0x7fffffff; /*:9*/ #line 151 "gb_flip.w" ; prev= A[i]; } /*10:*/ #line 211 "gb_flip.w" (void)gb_flip_cycle(); (void)gb_flip_cycle(); (void)gb_flip_cycle(); (void)gb_flip_cycle(); (void)gb_flip_cycle(); /*:10*/ #line 154 "gb_flip.w" ; } /*:8*//*12:*/ #line 239 "gb_flip.w" long gb_unif_rand(m) long m; {register unsigned long t= two_to_the_31-(two_to_the_31%m); register long r; do{ r= gb_next_rand(); }while(t<=(unsigned long)r); return r%m; } /*:12*/ #line 55 "gb_flip.w" /*:3*/