From 55431ec82f1db436938125d9d6169aab79cbd3d3 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Fri, 4 May 2012 18:44:53 +0000 Subject: Two basic random number generators, Cmwc is supposed to be a pretty good one. I need to get the base class and singleton interface in place. --- src/experimental/randomcmwc.cpp | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/experimental/randomcmwc.cpp (limited to 'src/experimental/randomcmwc.cpp') diff --git a/src/experimental/randomcmwc.cpp b/src/experimental/randomcmwc.cpp new file mode 100644 index 0000000..97f7262 --- /dev/null +++ b/src/experimental/randomcmwc.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2007-2012 Xagasoft, All rights reserved. + * + * This file is part of the libbu++ library and is released under the + * terms of the license contained in the file LICENSE. + */ + +#include "bu/randomcmwc.h" + +#define PHI 0x9e3779b9 + +RandomCmwc::RandomCmwc() : + q( NULL ), + c( 362436 ) +{ + q = new uint32_t[4096]; +} + +RandomCmwc::~RandomCmwc() +{ + delete[] q; +} + +void RandomCmwc::seed( int32_t iSeed ) +{ + int i; + + Q[0] = iSeed; + Q[1] = iSeed + PHI; + Q[2] = iSeed + PHI + PHI; + + for (i = 3; i < 4096; i++) + Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i; +} + +int32_t RandomCmwc::rand() +{ + uint64_t t, a = 18782LL; + static uint32_t i = 4095; + uint32_t x, r = 0xfffffffe; + i = (i + 1) & 4095; + t = a * Q[i] + c; + c = (t >> 32); + x = t + c; + if( x < c ) + { + x++; + c++; + } + return (Q[i] = r - x); +} + -- cgit v1.2.3