williamr@2: /* boost random/uniform_01.hpp header file williamr@2: * williamr@2: * Copyright Jens Maurer 2000-2001 williamr@2: * Distributed under the Boost Software License, Version 1.0. (See williamr@2: * accompanying file LICENSE_1_0.txt or copy at williamr@2: * http://www.boost.org/LICENSE_1_0.txt) williamr@2: * williamr@2: * See http://www.boost.org for most recent version including documentation. williamr@2: * williamr@2: * $Id: uniform_01.hpp,v 1.18 2004/07/27 03:43:32 dgregor Exp $ williamr@2: * williamr@2: * Revision history williamr@2: * 2001-02-18 moved to individual header files williamr@2: */ williamr@2: williamr@2: #ifndef BOOST_RANDOM_UNIFORM_01_HPP williamr@2: #define BOOST_RANDOM_UNIFORM_01_HPP williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: // Because it is so commonly used: uniform distribution on the real [0..1) williamr@2: // range. This allows for specializations to avoid a costly int -> float williamr@2: // conversion plus float multiplication williamr@2: template williamr@2: class uniform_01 williamr@2: { williamr@2: public: williamr@2: typedef UniformRandomNumberGenerator base_type; williamr@2: typedef RealType result_type; williamr@2: williamr@2: BOOST_STATIC_CONSTANT(bool, has_fixed_range = false); williamr@2: williamr@2: #if !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) && !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300) williamr@2: BOOST_STATIC_ASSERT(!std::numeric_limits::is_integer); williamr@2: #endif williamr@2: williamr@2: explicit uniform_01(base_type rng) williamr@2: : _rng(rng), williamr@2: _factor(result_type(1) / williamr@2: (result_type((_rng.max)()-(_rng.min)()) + williamr@2: result_type(std::numeric_limits::is_integer ? 1 : 0))) williamr@2: { williamr@2: } williamr@2: // compiler-generated copy ctor and copy assignment are fine williamr@2: williamr@2: result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return result_type(0); } williamr@2: result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return result_type(1); } williamr@2: base_type& base() { return _rng; } williamr@2: const base_type& base() const { return _rng; } williamr@2: void reset() { } williamr@2: williamr@2: result_type operator()() { williamr@2: return result_type(_rng() - (_rng.min)()) * _factor; williamr@2: } williamr@2: williamr@2: #if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) williamr@2: template williamr@2: friend std::basic_ostream& williamr@2: operator<<(std::basic_ostream& os, const uniform_01& u) williamr@2: { williamr@2: os << u._rng; williamr@2: return os; williamr@2: } williamr@2: williamr@2: template williamr@2: friend std::basic_istream& williamr@2: operator>>(std::basic_istream& is, uniform_01& u) williamr@2: { williamr@2: is >> u._rng; williamr@2: return is; williamr@2: } williamr@2: #endif williamr@2: williamr@2: private: williamr@2: typedef typename base_type::result_type base_result; williamr@2: base_type _rng; williamr@2: result_type _factor; williamr@2: }; williamr@2: williamr@2: #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION williamr@2: // A definition is required even for integral static constants williamr@2: template williamr@2: const bool uniform_01::has_fixed_range; williamr@2: #endif williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // BOOST_RANDOM_UNIFORM_01_HPP