#include "mcgill.h"
/*************************************************************************
M c G i l l -- S U P E R D U P E R
Random number generation package
-------------------------------------
G. Marsaglia, K. Ananthanarayanan, N. Paul
Incorparating the Ziggurat metho of sampling
from decreasing or symmetric unimodal density functions
G. Marsaglia, W. W. Tsang
Rewritten into C for the AT&T PC 6300 by
E. Schneider
*************************************************************************/
#define MULT 69069L
#define MASK32 0xFFFFFFFFUL
static unsigned long mcgn, srgn;
void
rstart(i1, i2)
long i1, i2;
{
mcgn = (i1 == 0) ? 0 : i1 | 1;
mcgn &= MASK32;
srgn = (i2 == 0) ? 0 : (i2 & 0x7ff) | 1;
srgn &= MASK32;
}
long
iuni()
{
register unsigned long r0, r1;
r0 = (srgn >> 15);
r1 = srgn ^ r0;
r0 = (r1 << 17);
r0 &= MASK32;
srgn = r0 ^ r1;
mcgn = MULT * mcgn;
mcgn &= MASK32;
r1 = mcgn ^ srgn;
return ((r1 >> 1));
}
long
ivni()
{
register unsigned long r0, r1;
r0 = (srgn >> 15);
r1 = srgn ^ r0;
r0 = (r1 << 17);
r0 &= MASK32;
srgn = r0 ^ r1;
mcgn = MULT * mcgn;
mcgn &= MASK32;
r1 = mcgn ^ srgn;
return (r1);
}
double
uni()
{
register unsigned long r0, r1;
r0 = (srgn >> 15);
r1 = srgn ^ r0;
r0 = (r1 << 17);
r0 &= 0xFFFFFFFFUL;
srgn = r0 ^ r1;
mcgn = MULT * mcgn;
mcgn &= 0xFFFFFFFFUL;
r1 = mcgn ^ srgn;
return ((double)(r1 >> 1) / 2147483648.);
}
double
vni()
{
register unsigned long r0, r1;
r0 = (srgn >> 15);
r1 = srgn ^ r0;
r0 = (r1 << 17);
r0 &= 0xFFFFFFFFUL;
srgn = r0 ^ r1;
mcgn = MULT * mcgn;
mcgn &= 0xFFFFFFFFUL;
r1 = mcgn ^ srgn;
return ((double)(r1) / 2147483648.);
}
syntax highlighted by Code2HTML, v. 0.9.1