...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
A random variate generator is used to join a random number generator together with a random number distribution. Boost.Random provides a vast choice of generators as well as distributions .
variate_generator
#include <boost/random/variate_generator.hpp> template<class Engine, class Distribution> class variate_generator { public: typedef Engine engine_type; typedef Distribution distribution_type; typedef typename Distribution::result_type result_type; variate_generator(Engine e, Distribution d); result_type operator()(); template<class T> result_type operator()(T value); engine_value_type& engine(); const engine_value_type& engine() const; result_type min() const; result_type max() const; };
Instantations of class template variate_generator
model a
number generator.
The argument for the template parameter Engine
shall be of
the form U, U&, or U*, where U models a uniform random number
generator. Then, the member engine_value_type
names U (not the
pointer or reference to U).
Specializations of variate_generator
satisfy the
requirements of CopyConstructible. They also satisfy the requirements of
Assignable unless the template parameter Engine is of the form U&.
The complexity of all functions specified in this section is constant. No function described in this section except the constructor throws an exception.
variate_generator(engine_type eng, distribution_type d)
Effects: Constructs a variate_generator
object with the associated uniform random number generator eng
and the associated random distribution d
.
Throws: If and what the copy constructor of Engine or
Distribution throws.
result_type operator()()
Returns: distribution()(e)
Notes: The sequence of numbers produced by the uniform
random number generator e
, se, is obtained from the
sequence of numbers produced by the associated uniform random number
generator eng
, seng, as follows: Consider the
values of numeric_limits<T>::is_integer
for
T
both Distribution::input_type
and
engine_value_type::result_type
. If the values for both types
are true
, then se is identical to seng.
Otherwise, if the values for both types are false
, then the
numbers in seng are divided by
engine().max()-engine().min()
to obtain the numbers in
se. Otherwise, if the value for
engine_value_type::result_type
is true
and the
value for Distribution::input_type
is false
, then
the numbers in seng are divided by
engine().max()-engine().min()+1
to obtain the numbers in
se. Otherwise, the mapping from seng to se
is implementation-defined. In all cases, an implicit conversion from
engine_value_type::result_type
to
Distribution::input_type
is performed. If such a conversion
does not exist, the program is ill-formed.
template<class T> result_type operator()(T value)
Returns: distribution()(e, value)
. For the
semantics of e
, see the description of
operator()()
.
engine_value_type& engine()
Returns: A reference to the associated uniform random number generator.
const engine_value_type& engine() const
Returns: A reference to the associated uniform random number generator.
distribution_type& distribution()
Returns: A reference to the associated random distribution.
const distribution_type& distribution() const
Returns: A reference to the associated random distribution.
result_type min() const
Precondition: distribution().min()
is
well-formed
Returns: distribution().min()
result_type max() const
Precondition: distribution().max()
is
well-formed
Returns: distribution().max()
Revised 05 December, 2006
Copyright © 2003-2004 Jens Maurer
Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)