Program Listing for File rng.hpp

Return to documentation for file (rcppsw/math/rng.hpp)

#pragma once

/*******************************************************************************
 * Includes
 ******************************************************************************/
#include "rcppsw/rcppsw.hpp"
#include "rcppsw/math/range.hpp"
#include "rcppsw/patterns/pimpl/pimpl.hpp"

/*******************************************************************************
 * Namespaces/Decls
 ******************************************************************************/
namespace rcppsw::math {

namespace detail {
struct rng_impl;
} /* namespace detail */

/*******************************************************************************
 * Class Definitions
 ******************************************************************************/
class rng final : public patterns::pimpl::pimpl<detail::rng_impl> {
 public:
  explicit rng(size_t seed);
  ~rng(void) override;

  size_t seed(void) const { return m_seed; }

  template <typename T>
  T uniform(const T& lb, const T& ub);

  template <typename T>
  T uniform(const range<T>& c_range) {
    return uniform(c_range.lb(), c_range.ub());
  }

  double gaussian(double mean, double std_dev);

  double exponential(double lambda);

  bool bernoulli(double p);

 private:
  /* clang-format off */
  size_t m_seed;
  /* clang-format on */
};

} /* namespace rcppsw::math */