Re: Marsaglia RNG in Mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg38973] Re: [mg38958] Marsaglia RNG in Mathematica
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Thu, 23 Jan 2003 08:04:14 -0500 (EST)
- References: <200301221114.GAA05344@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
flip wrote:
>
> Hello All,
>
> I was wondering if someone here would be nice enough to convert this C to
> Mathematica code. A module would be best I suppose, so users can just call
> it just like Random[].
>
> I'd like to experiment with this RNG in Mathematica. In fact, IIRC Mathematica uses some variant of SWC also.
>
> Thank you to anyone that can help.
>
> Flip (remove "_alpha" to email me directly)
>
> By the way, the following words are from another thread in another NG
> regarding a RNG.
>
> *** Words below from Dr. Marsaglia ***
>
> Here is a MWC example with period 3056868392^33216-1, a mere
> 10^4005 times as long as that of the Mersenne twister, yet faster,
> far simpler, and seemingly at least as well-performing in tests
> of randomness:
>
> static unsigned long Q[1038],c=362436;
>
> unsigned long MWC1038(void){
> static unsigned long i=1037;
> unsigned long long t, a=611373678LL;
> t=a*Q[i]+c; c=(t>>32);
> if(--i) return(Q[i]=t);
> i=1037; return(Q[0]=t);
> }
>
> You need to assign random 32-bits seeds to the static array Q[1038]
> and to the initial carry c, with 0<=c<61137367.
>
> George Marsaglia
I think the code below does what is intended. This assumes a long long
is 64 bits and a long is 32 bits. These are both quite platform
dependent for C; maybe Marsaglia specified a particular platform? (a URL
to his note would be helpful). For seeding the q and c variables I use
built-in Random. I also changed the variable names to avoid single
characters and capitalized names.
SeedRandom[1111];
qarray = Table[Random[Integer,{0,2^32-1}], {1038}];
cc = Random[Integer, {0,61137367}];
index = 1037;
aconst = 611373678;
mwc1038[] := Module[
{},
tt = aconst*qarray[[index]] + cc;
cc = Developer`BitShiftRight[tt,32]; (*Could instead use Quotient *)
tt = Mod[tt,2^32];
index--;
If [index!=0, qarray[[index]] = tt; Return[tt]];
index = 1037;
qarray[[0]] = tt
]
Example:
Table[mwc1038[], {10}]
Out[48]= {1392539486, 2580953375, 977837705, 1393978643, 2243451427,
374027900, 2689334407, 2953422566, 41924440, 2262165557}
Daniel Lichtblau
Wolfram Research
- References:
- Marsaglia RNG in Mathematica
- From: "flip" <flip_alpha@safebunch.com>
- Marsaglia RNG in Mathematica