/*Generate a triangular deviate with zero mean and range [-_range,_range].*/ static int32_t triangle_rand(kiss99_ctx *_kiss,int32_t _range){ uint32_t m; uint32_t r1; uint32_t r2; _range++; m=0xFFFFFFFFU/_range*_range; do r1=kiss99_rand(_kiss); while(r1>=m); do r2=kiss99_rand(_kiss); while(r2>=m); return (int32_t)(r1%_range)-(int32_t)(r2%_range); }
void kiss99_srand(kiss99_ctx *_this,const unsigned char *_data,int _ndata){ int i; _this->z=362436069; _this->w=521288629; _this->jsr=123456789; _this->jcong=380116160; for(i=3;i<_ndata;i+=4){ _this->z^=_data[i-3]; _this->w^=_data[i-2]; _this->jsr^=_data[i-1]; _this->jcong^=_data[i]; kiss99_rand(_this); } if(i-3<_ndata)_this->z^=_data[i-3]; if(i-2<_ndata)_this->w^=_data[i-2]; if(i-1<_ndata)_this->jsr^=_data[i-1]; }