Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.


/* boost random/bernoulli_distribution.hpp header file
 * Copyright Jens Maurer 2000-2001
 * 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,
 * Jens Maurer makes no representations about the suitability of this
 * software for any purpose. It is provided "as is" without express or
 * implied warranty.
 * See for most recent version including documentation.
 * $Id: bernoulli_distribution.hpp,v 2004/01/25 21:26:45 jmaurer Exp $
 * Revision history
 *  2001-02-18  moved to individual header files


#include <cassert>
#include <iostream>

namespace boost {

// Bernoulli distribution: p(true) = p, p(false) = 1-p   (boolean)
template<class RealType = double>
class bernoulli_distribution
  // In principle, this could work with both integer and floating-point
  // types.  Generating floating-point random numbers in the first
  // place is probably more expensive, so use integer as input.
  typedef int input_type;
  typedef bool result_type;

  explicit bernoulli_distribution(const RealType& p = RealType(0.5)) 
    : _p(p)
    assert(p >= 0);
    assert(p <= 1);

  // compiler-generated copy ctor and assignment operator are fine

  RealType p() const { return _p; }
  void reset() { }

  template<class Engine>
  result_type operator()(Engine& eng)
    if(_p == RealType(0))
      return false;
      return RealType(eng() - eng.min()) <= _p * RealType(eng.max()-eng.min());

  template<class CharT, class Traits>
  friend std::basic_ostream<CharT,Traits>&
  operator<<(std::basic_ostream<CharT,Traits>& os, const bernoulli_distribution& bd)
    os << bd._p;
    return os;

  template<class CharT, class Traits>
  friend std::basic_istream<CharT,Traits>&
  operator>>(std::basic_istream<CharT,Traits>& is, bernoulli_distribution& bd)
    is >> std::ws >> bd._p;
    return is;

  RealType _p;

} // namespace boost