+2011-03-25 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * include/bits/random.h (negative_binomial_distribution<>::
+ negative_binomial_distribution(_IntType, double),
+ negative_binomial_distribution<>::
+ negative_binomial_distribution(const param_type&)): Tweak
+ construction of _M_gd.
+ * include/bits/random.tcc (negative_binomial_distribution<>::
+ operator()): Adjust.
+
2011-03-24 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/random.h (negative_binomial_distribution<>::
explicit
negative_binomial_distribution(_IntType __k = 1, double __p = 0.5)
- : _M_param(__k, __p), _M_gd(__k, 1.0)
+ : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p)
{ }
explicit
negative_binomial_distribution(const param_type& __p)
- : _M_param(__p), _M_gd(__p.k(), 1.0)
+ : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p())
{ }
/**
return __is;
}
- // This is Leger's algorithm.
+ // This is Leger's algorithm, also in Devroye, Ch. X, Example 1.5.
template<typename _IntType>
template<typename _UniformRandomNumberGenerator>
typename negative_binomial_distribution<_IntType>::result_type
const double __y = _M_gd(__urng);
// XXX Is the constructor too slow?
- std::poisson_distribution<result_type> __poisson(__y * (1.0 - p())
- / p());
+ std::poisson_distribution<result_type> __poisson(__y);
return __poisson(__urng);
}
typedef typename std::gamma_distribution<result_type>::param_type
param_type;
- const double __y = _M_gd(__urng, param_type(__p.k(), 1.0));
+ const double __y =
+ _M_gd(__urng, param_type(__p.k(), (1.0 - __p.p()) / __p.p()));
- std::poisson_distribution<result_type> __poisson(__y * (1.0 - __p.p())
- / __p.p() );
+ std::poisson_distribution<result_type> __poisson(__y);
return __poisson(__urng);
}