/* boost random/binomial_distribution.hpp header file | |
* | |
* Copyright Jens Maurer 2002 | |
* 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) | |
* | |
* See http://www.boost.org for most recent version including documentation. | |
* | |
* $Id: binomial_distribution.hpp 60755 2010-03-22 00:45:06Z steven_watanabe $ | |
* | |
*/ | |
#ifndef BOOST_RANDOM_BINOMIAL_DISTRIBUTION_HPP | |
#define BOOST_RANDOM_BINOMIAL_DISTRIBUTION_HPP | |
#include <boost/config/no_tr1/cmath.hpp> | |
#include <cassert> | |
#include <boost/random/detail/config.hpp> | |
#include <boost/random/bernoulli_distribution.hpp> | |
namespace boost { | |
/** | |
* The binomial distribution is an integer valued distribution with | |
* two parameters, @c t and @c p. The values of the distribution | |
* are within the range [0,t]. | |
* | |
* The probability that the distribution produces a value k is | |
* \f${t \choose k}p^k(1-p)^{t-k}\f$. | |
*/ | |
template<class IntType = int, class RealType = double> | |
class binomial_distribution | |
{ | |
public: | |
typedef typename bernoulli_distribution<RealType>::input_type input_type; | |
typedef IntType result_type; | |
/** | |
* Construct an @c binomial_distribution object. @c t and @c p | |
* are the parameters of the distribution. | |
* | |
* Requires: t >=0 && 0 <= p <= 1 | |
*/ | |
explicit binomial_distribution(IntType t = 1, | |
const RealType& p = RealType(0.5)) | |
: _bernoulli(p), _t(t) | |
{ | |
assert(_t >= 0); | |
assert(RealType(0) <= p && p <= RealType(1)); | |
} | |
// compiler-generated copy ctor and assignment operator are fine | |
/** Returns: the @c t parameter of the distribution */ | |
IntType t() const { return _t; } | |
/** Returns: the @c p parameter of the distribution */ | |
RealType p() const { return _bernoulli.p(); } | |
/** | |
* Effects: Subsequent uses of the distribution do not depend | |
* on values produced by any engine prior to invoking reset. | |
*/ | |
void reset() { } | |
/** | |
* Returns: a random variate distributed according to the | |
* binomial distribution. | |
*/ | |
template<class Engine> | |
result_type operator()(Engine& eng) | |
{ | |
// TODO: This is O(_t), but it should be O(log(_t)) for large _t | |
result_type n = 0; | |
for(IntType i = 0; i < _t; ++i) | |
if(_bernoulli(eng)) | |
++n; | |
return n; | |
} | |
#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS | |
/** | |
* Writes the parameters of the distribution to a @c std::ostream. | |
*/ | |
template<class CharT, class Traits> | |
friend std::basic_ostream<CharT,Traits>& | |
operator<<(std::basic_ostream<CharT,Traits>& os, const binomial_distribution& bd) | |
{ | |
os << bd._bernoulli << " " << bd._t; | |
return os; | |
} | |
/** | |
* Reads the parameters of the distribution from a @c std::istream. | |
*/ | |
template<class CharT, class Traits> | |
friend std::basic_istream<CharT,Traits>& | |
operator>>(std::basic_istream<CharT,Traits>& is, binomial_distribution& bd) | |
{ | |
is >> std::ws >> bd._bernoulli >> std::ws >> bd._t; | |
return is; | |
} | |
#endif | |
private: | |
bernoulli_distribution<RealType> _bernoulli; | |
IntType _t; | |
}; | |
} // namespace boost | |
#endif // BOOST_RANDOM_BINOMIAL_DISTRIBUTION_HPP |