aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorAmi Tavory <atavory@gmail.com>2006-06-17 10:06:41 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2006-06-17 10:06:41 +0000
commit4dc3fbb0eb1e89262e6f49e0ee80381d94db5494 (patch)
treeb593e41c689e57eed39a6779649c91147ed4e289 /libstdc++-v3
parentda71e18caeb8bcc6c85c7785c137ee0f99516fb4 (diff)
downloadgcc-4dc3fbb0eb1e89262e6f49e0ee80381d94db5494.zip
gcc-4dc3fbb0eb1e89262e6f49e0ee80381d94db5494.tar.gz
gcc-4dc3fbb0eb1e89262e6f49e0ee80381d94db5494.tar.bz2
twister_rand_gen.cc: Adapt to simply use tr1::mt19937.
2006-06-17 Ami Tavory <atavory@gmail.com> Paolo Carlini <pcarlini@suse.de> * testsuite/util/rng/twister_rand_gen.cc: Adapt to simply use tr1::mt19937. * testsuite/util/rng/twister_rand_gen.hpp: Likewise. Co-Authored-By: Paolo Carlini <pcarlini@suse.de> From-SVN: r114740
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/testsuite/util/rng/twister_rand_gen.cc152
-rw-r--r--libstdc++-v3/testsuite/util/rng/twister_rand_gen.hpp60
3 files changed, 56 insertions, 163 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 66f3497..7ed9724 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2006-06-17 Ami Tavory <atavory@gmail.com>
+ Paolo Carlini <pcarlini@suse.de>
+
+ * testsuite/util/rng/twister_rand_gen.cc: Adapt to simply use
+ tr1::mt19937.
+ * testsuite/util/rng/twister_rand_gen.hpp: Likewise.
+
2006-06-16 Paolo Carlini <pcarlini@suse.de>
* include/tr1/random (uniform_real<>::uniform_real(_RealType,
diff --git a/libstdc++-v3/testsuite/util/rng/twister_rand_gen.cc b/libstdc++-v3/testsuite/util/rng/twister_rand_gen.cc
index 594a800..2163eb7 100644
--- a/libstdc++-v3/testsuite/util/rng/twister_rand_gen.cc
+++ b/libstdc++-v3/testsuite/util/rng/twister_rand_gen.cc
@@ -13,10 +13,10 @@
// 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 library; see the file COPYING. If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
-// MA 02111-1307, USA.
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
// As a special exception, you may use this file as part of a free
// software library without restriction. Specifically, if other files
@@ -40,82 +40,51 @@
// warranty.
/**
- * @file twister_rand_gen.cpp
- * Contains a random number generator invented and implemented by
- * Makoto Matsumoto
- * (http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html)
+ * @file twister_rand_gen.cc
*/
#include <util/rng/twister_rand_gen.hpp>
#include <ctime>
-#include <iostream>
namespace pb_ds
{
namespace test
{
-#ifdef TWISTER_RAND_GEN_DEBUG
+#ifdef PB_DS_TWISTER_RAND_GEN_DEBUG
#define PB_DS_DBG_ASSERT(X) assert(X)
#define PB_DS_DBG_VERIFY(X) assert(X)
#define PB_DS_DBG_ONLY(X) X
-#else // #ifdef TWISTER_RAND_GEN_DEBUG
-#define PB_DS_DBG_ASSERT(X)
+#else // #ifdef PB_DS_TWISTER_RAND_GEN_DEBUG
+#define PB_DS_DBG_ASSERT(X)
#define PB_DS_DBG_VERIFY(X) {if((X)==0);}
#define PB_DS_DBG_ONLY(X) ;
-#endif // #ifdef TWISTER_RAND_GEN_DEBUG
-
- enum
- {
- mers_n = 624,
- mers_m = 397,
- mers_r = 31,
- mers_u = 11,
- mers_s = 7,
- mers_t = 15,
- mers_l = 18,
- mers_a = 0x9908B0DF,
- mers_b = 0x9D2C5680,
- mers_c = 0xEFC60000
- };
+#endif // #ifdef PB_DS_TWISTER_RAND_GEN_DEBUG
twister_rand_gen::
- twister_rand_gen(unsigned long seed)
- { init(seed); }
+ twister_rand_gen(unsigned int seed)
+ : m_base_generator(seed)
+ {
+ // Do nothing.
+ }
void
twister_rand_gen::
- init(unsigned long seed)
- {
- m_a_mt[0]= seed;
-
- for (m_mti=1; m_mti < mers_n; ++m_mti)
- m_a_mt[m_mti] = (1812433253UL* (m_a_mt[m_mti-1] ^ (m_a_mt[m_mti-1] >> 30)) + m_mti);
-
- union
- {
- double m_f;
- unsigned long m_a[2];
- } u;
-
- u.m_f = 1.0;
-
- if (u.m_a[1] == 0x3FF00000)
- m_endianess = little;
- else if (u.m_a[0] == 0x3FF00000)
- m_endianess = big;
- else
- m_endianess = none;
- }
+ init(unsigned int seed)
+ { m_base_generator.seed(seed); }
unsigned long
twister_rand_gen::
get_unsigned_long(unsigned long min, unsigned long max)
{
PB_DS_DBG_ASSERT(max >= min);
+
const double prob = get_prob();
- const unsigned long rand_word =(unsigned long)((max - min+ 1)* prob) + min;
+
+ const unsigned long rand_word =
+ (unsigned long)((max - min + 1) * prob) + min;
PB_DS_DBG_ASSERT(rand_word <= max);
+
return rand_word;
}
@@ -123,77 +92,18 @@ namespace pb_ds
twister_rand_gen::
get_prob()
{
- union
- {
- double m_f;
- unsigned long m_a[2];
- } u;
-
- unsigned long rand_word = get_unsigned_long_imp();
-
- double ret;
-
- switch(m_endianess)
- {
- case little:
- u.m_a[0] = rand_word << 20;
- u.m_a[1] = (rand_word >> 12) | 0x3FF00000;
- ret = u.m_f - 1.0;
- break;
- case big:
- u.m_a[1] = rand_word << 20;
- u.m_a[0] = (rand_word >> 12) | 0x3FF00000;
- ret = u.m_f - 1.0;
- break;
- case none:
- default:
- break;
- }
-
- ret = (double)rand_word * (1./((double)(unsigned long)(-1L)+1.));
-
- PB_DS_DBG_ASSERT(ret >= 0);
- PB_DS_DBG_ASSERT(ret <= 1);
+ const double eng_min = m_base_generator.min();
+ const double eng_range =
+ static_cast<const double>(m_base_generator.max() - eng_min);
- return ret;
- }
+ const double eng_res =
+ static_cast<const double>(m_base_generator() - eng_min);
- unsigned long
- twister_rand_gen::
- get_unsigned_long_imp()
- {
- unsigned long y;
- if (m_mti >= mers_n)
- {
- const unsigned long LOWER_MASK = (1LU << mers_r) - 1;
- const unsigned long UPPER_MASK = static_cast<unsigned long>(-1L << mers_r);
- static const unsigned long m_a_mag01[2] = {0, mers_a};
-
- unsigned long kk;
- for (kk=0; kk < mers_n-mers_m; ++kk)
- {
- y = (m_a_mt[kk]& UPPER_MASK) | (m_a_mt[kk+1]& LOWER_MASK);
- m_a_mt[kk] = m_a_mt[kk+mers_m] ^ (y >> 1) ^ m_a_mag01[y& 1];
- }
-
- for (; kk < mers_n-1; ++kk)
- {
- y = (m_a_mt[kk]& UPPER_MASK) | (m_a_mt[kk+1]& LOWER_MASK);
- m_a_mt[kk] = m_a_mt[kk+(mers_m-mers_n)] ^ (y >> 1) ^ m_a_mag01[y& 1];
- }
-
- y = (m_a_mt[mers_n-1]& UPPER_MASK) | (m_a_mt[0]& LOWER_MASK);
- m_a_mt[mers_n-1] = m_a_mt[mers_m-1] ^ (y >> 1) ^ m_a_mag01[y& 1];
- m_mti = 0;
- }
-
- y = m_a_mt[m_mti++];
-
- y ^= y >> mers_u;
- y ^= (y << mers_s)& mers_b;
- y ^= (y << mers_t)& mers_c;
- y ^= y >> mers_l;
- return y;
+ const double ret = eng_res / eng_range;
+
+ PB_DS_DBG_ASSERT(ret >=0 && ret <= 1);
+
+ return ret;
}
#undef PB_DS_DBG_ASSERT
diff --git a/libstdc++-v3/testsuite/util/rng/twister_rand_gen.hpp b/libstdc++-v3/testsuite/util/rng/twister_rand_gen.hpp
index 5939664..cbc8d14 100644
--- a/libstdc++-v3/testsuite/util/rng/twister_rand_gen.hpp
+++ b/libstdc++-v3/testsuite/util/rng/twister_rand_gen.hpp
@@ -13,10 +13,10 @@
// 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 library; see the file COPYING. If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
-// MA 02111-1307, USA.
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
// As a special exception, you may use this file as part of a free
// software library without restriction. Specifically, if other files
@@ -41,9 +41,6 @@
/**
* @file twister_rand_gen.hpp
- * Contains a random number generator invented and implemented by
- * Makoto Matsumoto
- * (http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html)
*/
#ifndef PB_DS_TWISTER_RAND_GEN_HPP
@@ -51,6 +48,7 @@
#include <ctime>
#include <limits.h>
+#include <tr1/random>
namespace pb_ds
{
@@ -58,51 +56,29 @@ namespace pb_ds
{
class twister_rand_gen
{
- private:
- enum
- {
- mers_n = 624,
- mers_m = 397,
- mers_r = 31,
- mers_u = 11,
- mers_s = 7,
- mers_t = 15,
- mers_l = 18,
- mers_a = 0x9908B0DF,
- mers_b = 0x9D2C5680,
- mers_c = 0xEFC60000
- };
-
- unsigned long m_a_mt[mers_n];
- unsigned long m_mti;
-
- enum endianess_type
- {
- little,
- big,
- none
- };
-
- endianess_type m_endianess;
-
- unsigned long
- get_unsigned_long_imp();
-
public:
- twister_rand_gen(unsigned long seed = static_cast<unsigned long>(std::time(0)));
+ twister_rand_gen(unsigned int seed =
+ static_cast<unsigned int>(std::time(0)));
void
- init(unsigned long seed);
+ init(unsigned int seed);
- static unsigned long
+ static unsigned int
get_time_determined_seed()
- { return (static_cast<unsigned long>(std::time(0))); }
+ { return(static_cast<unsigned int>(std::time(0))); }
unsigned long
- get_unsigned_long(unsigned long min = 0, unsigned long max = UINT_MAX - 1);
+ get_unsigned_long(unsigned long min = 0,
+ unsigned long max = UINT_MAX - 1);
double
get_prob();
+
+ private:
+ typedef std::tr1::mt19937 base_generator_t;
+
+ private:
+ base_generator_t m_base_generator;
};
} // namespace test
} // namespace pb_ds