// -*- C++ -*-// Copyright (C) 2005, 2006, 2008, 2009 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// <http://www.gnu.org/licenses/>.// 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 <ctime>#include <climits>#include <debug/debug.h>#include <tr1/random>namespace __gnu_pbds{namespace test{class twister_rand_gen{public:twister_rand_gen(unsigned int seed =static_cast<unsigned int>(std::time(0))): m_base_generator(seed){// Do nothing.}voidinit(unsigned int seed){ m_base_generator.seed(seed); }static unsigned intget_time_determined_seed(){ return(static_cast<unsigned int>(std::time(0))); }unsigned longget_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;}doubleget_prob(){const double min = m_base_generator.min();const double max = m_base_generator.max();const double range = static_cast<const double>(max - min);const double res = static_cast<const double>(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