The Math Forum

Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Math Forum » Discussions » sci.math.* » sci.math

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: RNGs: A Super KISS
Replies: 14   Last Post: Feb 26, 2013 10:53 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]

Posts: 38
Registered: 6/19/08
RNGs: A Super KISS
Posted: Nov 3, 2009 10:46 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

For those mesmerized (or Mersenne-ized?) by a RNG
with period 2^19937-1, I offer one here with period
54767*2^1337279---over 10^396564 times as long.
It is one of my CMWC (Complimentary-Multiply-With-Carry) RNGs,
and is suggested here as one of the components of a
super-long-period KISS (Keep-It-Simple-Stupid) RNG.

With b=2^32 and a=7010176, and given a 32-bit x, and a 32-bit c, this
generator produces a new x,c by forming 64-bit t=a*x+c then replacing:
c=top 32 bits of t and x=(b-1)-(bottom 32 bits of t). In C: c=t>>32;

For many years, CPUs have had machine instructions to form such a
64-bit t and extract the top and bottom halves, but unfortunately
only recent Fortran versions have means to easily invoke them.

Ability to do those extractions leads to implementations that are
and extremely fast---some 140 million per second on my desktop PC.

Used alone, this generator passes all the Diehard Battery of Tests,
its simplicity makes it well-suited to serve as one of the three
of a KISS RNG, based on the Keep-It-Simple-Stupid principle, and the
supported by both theory and practice, that the combination of RNGs
based on
different mathematical models can be no worse---and is usually
any of the components.

So here is a complete C version of what might be called a SUPER KISS
combining, by addition mod 2^32, a Congruential RNG, a Xorshift RNG
and the super-long-period CMWC RNG:

#include <stdio.h>
static unsigned long Q

#define CNG ( xcng=69609*xcng+123 ) /*Congruential*/
#define XS ( xs^=xs<<13, xs^=(unsigned)xs>>17, xs^=xs>>5 ) /
#define SUPR ( indx<41790 ? Q[indx++] : refill() )

int refill( )
{ int i; unsigned long long t;
for(i=0;i<41790;i++) { t=7010176LL*Q[i]+carry; carry=(t>>32); Q[i]=~
indx=1; return (Q[0]);

int main()
{unsigned long i,x;
for(i=0;i<41790;i++) Q[i]=CNG+XS;
for(i=0;i<1000000000;i++) x=KISS;
printf(" x=%d.\nDoes x=-872412446?\n",x);

Running this program should produce 10^9 KISSes in some 7-15 seconds.
You are invited to cut, paste, compile and run for yourself, checking
see if the last value is as designated, (formatted as a signed integer
potential comparisons with systems using signed integers).
You may want to report or comment on implementations for other

The arithmetic operations are suited for either signed or unsigned
Thus, with (64-bit)t=a*x+c, x=t%b in C or x=mod(t,b) in Fortran, and
c=c/b in either C or Fortran, but with ways to avoid integer
and subsequent replacement of x by its base-b complement, ~x in C.

With b=2^32 and p=54767*2^1337287+1, the SUPR part of this Super KISS
uses my CMWC method to produce, in reverse order, the base-b expansion
of k/p for some k determined by the values used to seed the Q array.
The period is the order of b for that prime p:
54767*2^1337279, about 2^1337294 or 10^402566.
(It took a continuous run of 24+ days on an earlier PC to
establish that order. My thanks to the wizards behind PFGW
and to Phil Carmody for some suggested code.)

Even the Q's all zero, should seeding be overlooked in main(),
will still produce a sequence of the required period, but will
put the user in a strange and exceedingly rare place in the entire
sequence. Users should choose a reasonable number of the 1337280
random bits that a fully-seeded Q array requires.

Using your own choices of merely 87 seed bits, 32 each for xcng,xs
and 23 for carry<7010176, then initializing the Q array with
for(i=0;i<41790;i++) Q[i]=CNG+XS;
should serve well for many applications, but others, such as in
Law or Gaming, where a minimum number of possible outcomes may be
required, might need more of the 1337280 seed bits for the Q array.

As might applications in cryptography: With an unknown but fully-
seeded Q array, a particular string of, say, 41000 successive SUPR
values will appear at more than 2^20000 locations in the full
making it virtually impossible to get the location of that particular
string in the full loop, and thus predict coming or earlier values,
even if able to undo the CNG+XS operations.

So I again invite you to cut, paste, compile and run the above C
1000 million KISSes should be generated, and the specified result
by the time you count slowly to fifteen.
(Without an optimizing compiler, you may have to count more slowly.)

/* George Marsaglia */

Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© The Math Forum at NCTM 1994-2018. All Rights Reserved.