- typedef typename normal_distribution<RealType>::input_type input_type;
- typedef RealType result_type;
-
-#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
- BOOST_STATIC_ASSERT(!std::numeric_limits<RealType>::is_integer);
-#endif
-
- /**
- * Constructs a lognormal_distribution. @c mean and @c sigma are the
- * mean and standard deviation of the lognormal distribution.
- */
- explicit lognormal_distribution(result_type mean_arg = result_type(1),
- result_type sigma_arg = result_type(1))
- : _mean(mean_arg), _sigma(sigma_arg)
- {
- assert(_mean > result_type(0));
- init();
- }
-
- // compiler-generated copy ctor and assignment operator are fine
-
- RealType mean() const { return _mean; }
- RealType sigma() const { return _sigma; }
- void reset() { _normal.reset(); }
-
- template<class Engine>
- result_type operator()(Engine& eng)
- {
-#ifndef BOOST_NO_STDC_NAMESPACE
- // allow for Koenig lookup
- using std::exp;
-#endif
- return exp(_normal(eng) * _nsigma + _nmean);
- }
-
-#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
- template<class CharT, class Traits>
- friend std::basic_ostream<CharT,Traits>&
- operator<<(std::basic_ostream<CharT,Traits>& os, const lognormal_distribution& ld)
- {
- os << ld._normal << " " << ld._mean << " " << ld._sigma;
- return os;
- }
-
- template<class CharT, class Traits>
- friend std::basic_istream<CharT,Traits>&
- operator>>(std::basic_istream<CharT,Traits>& is, lognormal_distribution& ld)
- {
- is >> std::ws >> ld._normal >> std::ws >> ld._mean >> std::ws >> ld._sigma;
- ld.init();
- return is;
- }
-#endif
+ typedef typename normal_distribution<RealType>::input_type input_type;
+ typedef RealType result_type;
+
+ class param_type
+ {
+ public:
+
+ typedef lognormal_distribution distribution_type;
+
+ /** Constructs the parameters of a lognormal_distribution. */
+ explicit param_type(RealType m_arg = RealType(0.0),
+ RealType s_arg = RealType(1.0))
+ : _m(m_arg), _s(s_arg) {}
+
+ /** Returns the "m" parameter of the distribution. */
+ RealType m() const { return _m; }
+
+ /** Returns the "s" parameter of the distribution. */
+ RealType s() const { return _s; }
+
+ /** Writes the parameters to a std::ostream. */
+ BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm)
+ {
+ os << parm._m << " " << parm._s;
+ return os;
+ }
+
+ /** Reads the parameters from a std::istream. */
+ BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm)
+ {
+ is >> parm._m >> std::ws >> parm._s;
+ return is;
+ }
+
+ /** Returns true if the two sets of parameters are equal. */
+ BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
+ { return lhs._m == rhs._m && lhs._s == rhs._s; }
+
+ /** Returns true if the two sets of parameters are different. */
+ BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type)
+
+ private:
+ RealType _m;
+ RealType _s;
+ };
+
+ /**
+ * Constructs a lognormal_distribution. @c m and @c s are the
+ * parameters of the distribution.
+ */
+ explicit lognormal_distribution(RealType m_arg = RealType(0.0),
+ RealType s_arg = RealType(1.0))
+ : _normal(m_arg, s_arg) {}
+
+ /**
+ * Constructs a lognormal_distribution from its parameters.
+ */
+ explicit lognormal_distribution(const param_type& parm)
+ : _normal(parm.m(), parm.s()) {}
+
+ // compiler-generated copy ctor and assignment operator are fine
+
+ /** Returns the m parameter of the distribution. */
+ RealType m() const { return _normal.mean(); }
+ /** Returns the s parameter of the distribution. */
+ RealType s() const { return _normal.sigma(); }
+
+ /** Returns the smallest value that the distribution can produce. */
+ RealType min BOOST_PREVENT_MACRO_SUBSTITUTION () const
+ { return RealType(0); }
+ /** Returns the largest value that the distribution can produce. */
+ RealType max BOOST_PREVENT_MACRO_SUBSTITUTION () const
+ { return (std::numeric_limits<RealType>::infinity)(); }
+
+ /** Returns the parameters of the distribution. */
+ param_type param() const { return param_type(m(), s()); }
+ /** Sets the parameters of the distribution. */
+ void param(const param_type& parm)
+ {
+ typedef normal_distribution<RealType> normal_type;
+ typename normal_type::param_type normal_param(parm.m(), parm.s());
+ _normal.param(normal_param);
+ }
+
+ /**
+ * Effects: Subsequent uses of the distribution do not depend
+ * on values produced by any engine prior to invoking reset.
+ */
+ void reset() { _normal.reset(); }
+
+ /**
+ * Returns a random variate distributed according to the
+ * lognormal distribution.
+ */
+ template<class Engine>
+ result_type operator()(Engine& eng)
+ {
+ using std::exp;
+ return exp(_normal(eng));
+ }
+
+ /**
+ * Returns a random variate distributed according to the
+ * lognormal distribution with parameters specified by param.
+ */
+ template<class Engine>
+ result_type operator()(Engine& eng, const param_type& parm)
+ { return lognormal_distribution(parm)(eng); }
+
+ /** Writes the distribution to a @c std::ostream. */
+ BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, lognormal_distribution, ld)
+ {
+ os << ld._normal;
+ return os;
+ }
+
+ /** Reads the distribution from a @c std::istream. */
+ BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, lognormal_distribution, ld)
+ {
+ is >> ld._normal;
+ return is;
+ }
+
+ /**
+ * Returns true if the two distributions will produce identical
+ * sequences of values given equal generators.
+ */
+ BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(lognormal_distribution, lhs, rhs)
+ { return lhs._normal == rhs._normal; }
+
+ /**
+ * Returns true if the two distributions may produce different
+ * sequences of values given equal generators.
+ */
+ BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(lognormal_distribution)