From 21df391dc6055884e621181cbc3b51d9ec2b095c Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Fri, 9 Nov 2012 19:10:54 +0000 Subject: Added Mersenne Twister random number generator. --- src/stable/randommersenne.cpp | 44 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/stable/randommersenne.cpp (limited to 'src/stable/randommersenne.cpp') diff --git a/src/stable/randommersenne.cpp b/src/stable/randommersenne.cpp new file mode 100644 index 0000000..2d9e85b --- /dev/null +++ b/src/stable/randommersenne.cpp @@ -0,0 +1,44 @@ +#include "bu/randommersenne.h" + +Bu::RandomMersenne::RandomMersenne( int32_t iSeed ) : + iIndex( 0 ) +{ + seed( iSeed ); +} + +Bu::RandomMersenne::~RandomMersenne() +{ +} + +void Bu::RandomMersenne::seed( int32_t iSeed ) +{ + iMt[0] = iSeed; + for( int j = 1; j < 624; j++ ) + { + iMt[j] = 0x6c078965 * (iMt[j-1]^(iMt[j-1]>>30)) + j; + } +} + +int32_t Bu::RandomMersenne::rand() +{ + if( iIndex == 0 ) + { + for( int j = 0; j < 624; j++ ) + { + uint32_t y = (iMt[j] & 0x80000000) + (iMt[(j+1)%624] & 0x7fffffff); + iMt[j] = iMt[(j+397)%624] ^ (y>>1); + if( (y%2) ) + iMt[j] = iMt[j]^0x9908b0df; + } + } + + uint32_t y = iMt[iIndex]; + y = y ^ (y>>11); + y = y ^ ((y<<7)&0x9d2c5680); + y = y ^ ((y<<15)&0xefc60000); + y = y ^ (y>>18); + + iIndex = (iIndex + 1) % 624; + return y; +} + -- cgit v1.2.3