// -*- C++ -*- // Copyright (C) 2005-2021 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library 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 3, or (at your option) any later // version. // This library 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 library; see the file COPYING3. If not see // . // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. // Permission to use, copy, modify, sell, and distribute this software // is hereby granted without fee, provided that the above copyright // notice appears in all copies, and that both that copyright notice // and this permission notice appear in supporting documentation. None // of the above authors, nor IBM Haifa Research Laboratories, make any // representation about the suitability of this software for any // purpose. It is provided "as is" without express or implied // warranty. /** * @file testsuite_rng.h */ #ifndef _GLIBCXX_TESTSUITE_RNG_H #define _GLIBCXX_TESTSUITE_RNG_H #include #include #include #include namespace __gnu_pbds { namespace test { class twister_rand_gen { public: twister_rand_gen(unsigned int seed = static_cast(std::time(0))) : m_base_generator(seed) { // Do nothing. } void init(unsigned int seed) { m_base_generator.seed(seed); } static unsigned int get_time_determined_seed() { return(static_cast(std::time(0))); } unsigned long get_unsigned_long(unsigned long min = 0, unsigned long max = UINT_MAX - 1) { _GLIBCXX_DEBUG_ASSERT(max >= min); const double prob = get_prob(); const unsigned long r = (unsigned long)((max - min + 1) * prob) + min; _GLIBCXX_DEBUG_ASSERT(r <= max); return r; } double get_prob() { const double min = m_base_generator.min(); const double max = m_base_generator.max(); const double range = static_cast(max - min); const double res = static_cast(m_base_generator() - min); const double ret = res / range; _GLIBCXX_DEBUG_ASSERT(ret >= 0 && ret <= 1); return ret; } private: typedef std::tr1::mt19937 base_generator_t; base_generator_t m_base_generator; }; } // namespace test } // namespace __gnu_pbds #endif // #ifndef _GLIBCXX_TESTSUITE_RNG_H