summaryrefslogtreecommitdiff
path: root/src/Sockets/RandomNumber.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Sockets/RandomNumber.h')
-rw-r--r--src/Sockets/RandomNumber.h202
1 files changed, 202 insertions, 0 deletions
diff --git a/src/Sockets/RandomNumber.h b/src/Sockets/RandomNumber.h
new file mode 100644
index 0000000..376db43
--- /dev/null
+++ b/src/Sockets/RandomNumber.h
@@ -0,0 +1,202 @@
+/**
+ * @author Adam McLaurin
+ * @date September 2006
+ */
+/*
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef _SOCKET_RandomNumber_H
+#define _SOCKET_RandomNumber_H
+
+#include "sockets-config.h"
+#include <limits>
+
+#ifdef SOCKETS_NAMESPACE
+namespace SOCKETS_NAMESPACE {
+#endif
+
+/**
+ * The following class uses an xorshift algorithm proposed in the following
+ * paper:
+ * - http://www.jstatsoft.org/v08/i14/xorshift.pdf
+ *
+ * The algorithm provides a PRNG with a period of (2^128)-1
+ *
+ * This PRNG is *not* intended for cryptographic purposes
+ */
+class RandomNumber
+{
+
+public:
+ /**
+ * Default constructor
+ *
+ * NOTE: Internal seeds are set to defaults proposed by the paper
+ */
+ RandomNumber(bool time_shuffle = false);
+
+ /**
+ * Custom constructor
+ *
+ * @param x_seed X seed
+ *
+ * @param y_seed Y seed
+ *
+ * @param z_seed Z seed
+ *
+ * @param w_seed W seed
+ */
+ RandomNumber(
+ unsigned long int x_seed,
+ unsigned long int y_seed,
+ unsigned long int z_seed,
+ unsigned long int w_seed);
+
+ /**
+ * Destructor
+ */
+ ~RandomNumber();
+
+ // public methods
+
+ /**
+ * Reset internal state to initial seed values
+ */
+ void reset();
+
+ /**
+ * Cast operator to obtain current random value in the PRNG
+ *
+ * @return Current random value in the PRNG
+ */
+ operator unsigned long int() const;
+
+ /**
+ * Go to the next number in the PRNG sequence
+ *
+ * NOTE: This method is a slightly modified implementation of the xor128()
+ * function proposed in the paper
+ *
+ * @return Next value produced by the PRNG (after updating)
+ */
+ unsigned long int next();
+
+ /**
+ * Skip ahead in the PRNG sequence by a given number of iterations
+ *
+ * @param s Number of iterations to skip ahead
+ *
+ * @return Value produced by the PRNG after skipping ahead in the sequence
+ */
+ unsigned long int skip(unsigned long int s);
+
+ /**
+ * Obtain all the initial seeds for this PRNG
+ *
+ * @param x_seed X seed (output)
+ *
+ * @param y_seed Y seed (output)
+ *
+ * @param z_seed Z seed (output)
+ *
+ * @param w_seed W seed (output)
+ */
+ void getSeed(
+ unsigned long int& x_seed,
+ unsigned long int& y_seed,
+ unsigned long int& z_seed,
+ unsigned long int& w_seed);
+
+ /**
+ * Get the maximum possible random number from this PRNG
+ *
+ * @return Maximum possible random number from this PRNG
+ */
+ static unsigned long int max_random();
+
+ // public constants
+
+ /**
+ * Default x-seed as proposed by the paper
+ */
+ static const unsigned long int X_SEED_DEFAULT;
+
+ /**
+ * Default y-seed as proposed by the paper
+ */
+ static const unsigned long int Y_SEED_DEFAULT;
+
+ /**
+ * Default z-seed as proposed by the paper
+ */
+ static const unsigned long int Z_SEED_DEFAULT;
+
+ /**
+ * Default w-seed as proposed by the paper
+ */
+ static const unsigned long int W_SEED_DEFAULT;
+
+private:
+ /**
+ * X seed
+ */
+ unsigned long int mXSeed;
+
+ /**
+ * Y seed
+ */
+ unsigned long int mYSeed;
+
+ /**
+ * Z seed
+ */
+ unsigned long int mZSeed;
+
+ /**
+ * W seed
+ */
+ unsigned long int mWSeed;
+
+ /**
+ * X value
+ */
+ unsigned long int mX;
+
+ /**
+ * Y value
+ */
+ unsigned long int mY;
+
+ /**
+ * Z value
+ */
+ unsigned long int mZ;
+
+ /**
+ * W value
+ *
+ * NOTE: This is the externally-visible next value produced by the PRNG
+ */
+ unsigned long int mW;
+
+};
+
+#ifdef SOCKETS_NAMESPACE
+} // namespace SOCKETS_NAMESPACE {
+#endif
+
+#endif // _SOCKETS_RandomNumber_H
+