# A Super Tiny Random Number Generator

When I posted the last blog post about shuffling on the GameProgrammer.com mailing list, someone responded back with a super tiny random number generator that is actually pretty damn good. It is this:

```x+=(x*x) | 5;
```

The high bit of X is the source of your random numbers, so if you want to generate an 8 bit random number, you have to call it 8 times. Apparently it passes a lot of tests for randomness really well and is a pretty high quality PRNG. Check this out for more info: http://www.woodmann.com/forum/showthread.php?3100-super-tiny-PRNG

You can start x at whatever you want, but it might take a few iterations to “warm up” especially if you start with a small seed (ie you may want to throw away the first 5-10 random bits it generates as they may not be that random). I adapted it into an example program below, along with some example output. I use time() to set the initial value of x.

```#include
#include
#include
#include

// A super tiny prng
//
unsigned int seed = 0;
unsigned int GenerateRandomBit()
{
seed += (seed * seed) | 5;
return seed & 0x80000000;
}

template
void GenerateRandom(T& value)
{
memset(&value, 0, sizeof(T));
const unsigned int numBits = sizeof(T) * 8;
unsigned int* dataPointer = (unsigned int *)&value;
for (unsigned int index = 0; index < numBits; ++index)
{
if(GenerateRandomBit()) {
unsigned int pointerIndex = index / 32;
unsigned int mask = 1 << index % 32;
}
}
}

int main(int argc, char **argv)
{
seed = (unsigned int)time(NULL);
printf("seed = %urn", seed);

printf("9 random uints...rn");

for (unsigned int index = 0; index < 9; ++index)
{
unsigned int random;
GenerateRandom(random);
printf("%2u: %10u (%x)rn", index, random, random);
}

printf("3 random floats...rn");
for (unsigned int index = 0; index < 3; ++index)
{
float f;
GenerateRandom(f);
printf("%2u: %f (%x)rn", index, f, *((unsigned int*)&f));
}

printf("8 random characters...rn");
char text[8];
GenerateRandom(text);
for (unsigned int index = 0; index < 8; ++index)
{
printf("%2u: %crn", index, text[index]);
}
system("pause");
return 0;
}
```