#include "ATOOLS/Math/Marsaglia.H" #include using namespace ATOOLS; #define UC (unsigned char) #define znew(z) (z=36969*(z&65535)+(z>>16)) #define wnew(w) (w=18000*(w&65535)+(w>>16)) #define MWC(z,w) ((znew(z)<<16)+wnew(w)) #define SHR3(jsr) (jsr^=(jsr<<17), jsr^=(jsr>>13), jsr^=(jsr<<5)) #define CONG(jcong) (jcong=69069*jcong+1234567) #define KISS(z,w,jcong,jsr) ((MWC(z,w)^CONG(jcong))+SHR3(jsr)) #define SWB(c,bro,x,y,t) (c++,bro=(x draws in interval [0,1] including exact 0. and 1. // change to (KISS+SWB+1)/4294967297 // -> draws in interval [1/4294967297,4294967296/4294967297] return (KISS(m_z,m_w,m_jcong,m_jsr) +SWB(m_c,m_bro,m_x,m_y,m_t)+1.)*2.328306436e-10; } void Marsaglia::WriteStatus(std::ostream &str) { str.write((char*)this,sizeof(*this)); } bool Marsaglia::ReadStatus(std::istream &str) { str.read((char*)this,sizeof(*this)); return true; }