]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/random/geometric_distribution.hpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
261bd471c9bbce8672493e9fef8b7c0587d8b150
[canny.git] / stc / exp / ml_stc_linux_make_v1.0 / include / boost / random / geometric_distribution.hpp
1 /* boost random/geometric_distribution.hpp header file\r
2  *\r
3  * Copyright Jens Maurer 2000-2001\r
4  * Distributed under the Boost Software License, Version 1.0. (See\r
5  * accompanying file LICENSE_1_0.txt or copy at\r
6  * http://www.boost.org/LICENSE_1_0.txt)\r
7  *\r
8  * See http://www.boost.org for most recent version including documentation.\r
9  *\r
10  * $Id: geometric_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $\r
11  *\r
12  * Revision history\r
13  *  2001-02-18  moved to individual header files\r
14  */\r
15 \r
16 #ifndef BOOST_RANDOM_GEOMETRIC_DISTRIBUTION_HPP\r
17 #define BOOST_RANDOM_GEOMETRIC_DISTRIBUTION_HPP\r
18 \r
19 #include <boost/config/no_tr1/cmath.hpp>          // std::log\r
20 #include <cassert>\r
21 #include <iostream>\r
22 #include <boost/random/detail/config.hpp>\r
23 #include <boost/random/uniform_01.hpp>\r
24 \r
25 namespace boost {\r
26 \r
27 #if defined(__GNUC__) && (__GNUC__ < 3)\r
28 // Special gcc workaround: gcc 2.95.x ignores using-declarations\r
29 // in template classes (confirmed by gcc author Martin v. Loewis)\r
30   using std::log;\r
31 #endif\r
32 \r
33 // geometric distribution: p(i) = (1-p) * pow(p, i-1)   (integer)\r
34 template<class IntType = int, class RealType = double>\r
35 class geometric_distribution\r
36 {\r
37 public:\r
38   typedef RealType input_type;\r
39   typedef IntType result_type;\r
40 \r
41   explicit geometric_distribution(const RealType& p_arg = RealType(0.5))\r
42     : _p(p_arg)\r
43   {\r
44     assert(RealType(0) < _p && _p < RealType(1));\r
45     init();\r
46   }\r
47 \r
48   // compiler-generated copy ctor and assignment operator are fine\r
49 \r
50   RealType p() const { return _p; }\r
51   void reset() { }\r
52 \r
53   template<class Engine>\r
54   result_type operator()(Engine& eng)\r
55   {\r
56 #ifndef BOOST_NO_STDC_NAMESPACE\r
57     using std::log;\r
58     using std::floor;\r
59 #endif\r
60     return IntType(floor(log(RealType(1)-eng()) / _log_p)) + IntType(1);\r
61   }\r
62 \r
63 #ifndef BOOST_RANDOM_NO_STREAM_OPERATORS\r
64   template<class CharT, class Traits>\r
65   friend std::basic_ostream<CharT,Traits>&\r
66   operator<<(std::basic_ostream<CharT,Traits>& os, const geometric_distribution& gd)\r
67   {\r
68     os << gd._p;\r
69     return os;\r
70   }\r
71 \r
72   template<class CharT, class Traits>\r
73   friend std::basic_istream<CharT,Traits>&\r
74   operator>>(std::basic_istream<CharT,Traits>& is, geometric_distribution& gd)\r
75   {\r
76     is >> std::ws >> gd._p;\r
77     gd.init();\r
78     return is;\r
79   }\r
80 #endif\r
81 \r
82 private:\r
83   void init()\r
84   {\r
85 #ifndef BOOST_NO_STDC_NAMESPACE\r
86     using std::log;\r
87 #endif\r
88     _log_p = log(_p);\r
89   }\r
90 \r
91   RealType _p;\r
92   RealType _log_p;\r
93 };\r
94 \r
95 } // namespace boost\r
96 \r
97 #endif // BOOST_RANDOM_GEOMETRIC_DISTRIBUTION_HPP\r
98 \r