summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/random/mersenne_twister.hpp')
-rw-r--r--3rdParty/Boost/src/boost/random/mersenne_twister.hpp90
1 files changed, 55 insertions, 35 deletions
diff --git a/3rdParty/Boost/src/boost/random/mersenne_twister.hpp b/3rdParty/Boost/src/boost/random/mersenne_twister.hpp
index be60389..3878fee 100644
--- a/3rdParty/Boost/src/boost/random/mersenne_twister.hpp
+++ b/3rdParty/Boost/src/boost/random/mersenne_twister.hpp
@@ -9,7 +9,8 @@
* See http://www.boost.org for most recent version including documentation.
*
- * $Id: mersenne_twister.hpp 74867 2011-10-09 23:13:31Z steven_watanabe $
+ * $Id$
*
* Revision history
+ * 2013-10-14 fixed some warnings with Wshadow (mgaunard)
* 2001-02-18 moved to individual header files
*/
@@ -41,5 +42,5 @@ namespace random {
* pseudo-random number generator", Makoto Matsumoto and Takuji Nishimura,
* ACM Transactions on Modeling and Computer Simulation: Special Issue on
- * Uniform Random Number Generation, Vol. 8, No. 1, January 1998, pp. 3-30.
+ * Uniform Random Number Generation, Vol. 8, No. 1, January 1998, pp. 3-30.
* @endblockquote
*
@@ -52,5 +53,5 @@ namespace random {
* The seeding from an integer was changed in April 2005 to address a
* <a href="http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html">weakness</a>.
- *
+ *
* The quality of the generator crucially depends on the choice of the
* parameters. User code should employ one of the sensibly parameterized
@@ -84,5 +85,5 @@ public:
BOOST_STATIC_CONSTANT(UIntType, initialization_multiplier = f);
BOOST_STATIC_CONSTANT(UIntType, default_seed = 5489u);
-
+
// backwards compatibility
BOOST_STATIC_CONSTANT(UIntType, parameter_a = a);
@@ -93,5 +94,5 @@ public:
BOOST_STATIC_CONSTANT(UIntType, output_c = c);
BOOST_STATIC_CONSTANT(std::size_t, output_l = l);
-
+
// old Boost.Random concept requirements
BOOST_STATIC_CONSTANT(bool, has_fixed_range = false);
@@ -137,5 +138,5 @@ public:
BOOST_RANDOM_DETAIL_ARITHMETIC_SEED(mersenne_twister_engine, UIntType, value)
{
- // New seeding algorithm from
+ // New seeding algorithm from
// http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html
// In the previous versions, MSBs of the seed affected only MSBs of the
@@ -148,6 +149,8 @@ public:
x[i] = (f * (x[i-1] ^ (x[i-1] >> (w-2))) + i) & mask;
}
+
+ normalize_state();
}
-
+
/**
* Seeds a mersenne_twister_engine using values produced by seq.generate().
@@ -158,11 +161,5 @@ public:
i = n;
- // fix up the state if it's all zeroes.
- if((x[0] & (~static_cast<UIntType>(0) << r)) == 0) {
- for(std::size_t j = 1; j < n; ++j) {
- if(x[j] != 0) return;
- }
- x[0] = static_cast<UIntType>(1) << (w-1);
- }
+ normalize_state();
}
@@ -174,13 +171,7 @@ public:
i = n;
- // fix up the state if it's all zeroes.
- if((x[0] & (~static_cast<UIntType>(0) << r)) == 0) {
- for(std::size_t j = 1; j < n; ++j) {
- if(x[j] != 0) return;
- }
- x[0] = static_cast<UIntType>(1) << (w-1);
- }
+ normalize_state();
}
-
+
/** Returns the smallest value that the generator can produce. */
static result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
@@ -189,5 +180,5 @@ public:
static result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
{ return boost::low_bits_mask_t<w>::sig_bits; }
-
+
/** Produces the next value of the generator. */
result_type operator()();
@@ -224,5 +215,5 @@ public:
return os;
}
-
+
/** Reads a mersenne_twister_engine from a @c std::istream */
template<class CharT, class Traits>
@@ -245,17 +236,17 @@ public:
* and will thus produce identical sequences.
*/
- friend bool operator==(const mersenne_twister_engine& x,
- const mersenne_twister_engine& y)
+ friend bool operator==(const mersenne_twister_engine& x_,
+ const mersenne_twister_engine& y_)
{
- if(x.i < y.i) return x.equal_imp(y);
- else return y.equal_imp(x);
+ if(x_.i < y_.i) return x_.equal_imp(y_);
+ else return y_.equal_imp(x_);
}
-
+
/**
* Returns true if the two generators are in different states.
*/
- friend bool operator!=(const mersenne_twister_engine& x,
- const mersenne_twister_engine& y)
- { return !(x == y); }
+ friend bool operator!=(const mersenne_twister_engine& x_,
+ const mersenne_twister_engine& y_)
+ { return !(x_ == y_); }
private:
@@ -334,4 +325,33 @@ private:
/**
+ * Converts an arbitrary array into a valid generator state.
+ * First we normalize x[0], so that it contains the same
+ * value we would get by running the generator forwards
+ * and then in reverse. (The low order r bits are redundant).
+ * Then, if the state consists of all zeros, we set the
+ * high order bit of x[0] to 1. This function only needs to
+ * be called by seed, since the state transform preserves
+ * this relationship.
+ */
+ void normalize_state()
+ {
+ const UIntType upper_mask = (~static_cast<UIntType>(0)) << r;
+ const UIntType lower_mask = ~upper_mask;
+ UIntType y0 = x[m-1] ^ x[n-1];
+ if(y0 & (static_cast<UIntType>(1) << (w-1))) {
+ y0 = ((y0 ^ a) << 1) | 1;
+ } else {
+ y0 = y0 << 1;
+ }
+ x[0] = (x[0] & upper_mask) | (y0 & lower_mask);
+
+ // fix up the state if it's all zeroes.
+ for(std::size_t j = 0; j < n; ++j) {
+ if(x[j] != 0) return;
+ }
+ x[0] = static_cast<UIntType>(1) << (w-1);
+ }
+
+ /**
* Given a pointer to the last element of the rewind array,
* and the current size of the rewind array, finds an element
@@ -355,5 +375,5 @@ private:
// x(i-k) ... x(i) x(i+1) ... x(i-k+n-1)
- UIntType x[n];
+ UIntType x[n];
std::size_t i;
};
@@ -469,5 +489,5 @@ mersenne_twister_engine<UIntType,w,n,m,r,a,u,d,s,b,t,c,l,f>::operator()()
* and Takuji Nishimura, ACM Transactions on Modeling and
* Computer Simulation: Special Issue on Uniform Random Number
- * Generation, Vol. 8, No. 1, January 1998, pp. 3-30.
+ * Generation, Vol. 8, No. 1, January 1998, pp. 3-30.
* @endblockquote
*/
@@ -483,5 +503,5 @@ typedef mersenne_twister_engine<uint32_t,32,351,175,19,0xccab8ee7,
* and Takuji Nishimura, ACM Transactions on Modeling and
* Computer Simulation: Special Issue on Uniform Random Number
- * Generation, Vol. 8, No. 1, January 1998, pp. 3-30.
+ * Generation, Vol. 8, No. 1, January 1998, pp. 3-30.
* @endblockquote
*/