40#ifndef BOOST_165_RANDOM_NORMAL_DISTRIBUTION_HPP
41#define BOOST_165_RANDOM_NORMAL_DISTRIBUTION_HPP
43#include <boost/assert.hpp>
44#include <boost/config/no_tr1/cmath.hpp>
45#include <boost/limits.hpp>
46#include <boost/random/detail/config.hpp>
48#include <boost/random/detail/operators.hpp>
50#include <boost/random/uniform_01.hpp>
51#include <boost/static_assert.hpp>
67 template <
class RealType>
70 static const RealType table_x[129];
71 static const RealType table_y[129];
74 template <
class RealType>
76 3.7130862467403632609, 3.4426198558966521214, 3.2230849845786185446, 3.0832288582142137009,
77 2.9786962526450169606, 2.8943440070186706210, 2.8231253505459664379, 2.7611693723841538514,
78 2.7061135731187223371, 2.6564064112581924999, 2.6109722484286132035, 2.5690336259216391328,
79 2.5300096723854666170, 2.4934545220919507609, 2.4590181774083500943, 2.4264206455302115930,
80 2.3954342780074673425, 2.3658713701139875435, 2.3375752413355307354, 2.3104136836950021558,
81 2.2842740596736568056, 2.2590595738653295251, 2.2346863955870569803, 2.2110814088747278106,
82 2.1881804320720206093, 2.1659267937448407377, 2.1442701823562613518, 2.1231657086697899595,
83 2.1025731351849988838, 2.0824562379877246441, 2.0627822745039633575, 2.0435215366506694976,
84 2.0246469733729338782, 2.0061338699589668403, 1.9879595741230607243, 1.9701032608497132242,
85 1.9525457295488889058, 1.9352692282919002011, 1.9182573008597320303, 1.9014946531003176140,
86 1.8849670357028692380, 1.8686611409895420085, 1.8525645117230870617, 1.8366654602533840447,
87 1.8209529965910050740, 1.8054167642140487420, 1.7900469825946189862, 1.7748343955807692457,
88 1.7597702248942318749, 1.7448461281083765085, 1.7300541605582435350, 1.7153867407081165482,
89 1.7008366185643009437, 1.6863968467734863258, 1.6720607540918522072, 1.6578219209482075462,
90 1.6436741568569826489, 1.6296114794646783962, 1.6156280950371329644, 1.6017183802152770587,
91 1.5878768648844007019, 1.5740982160167497219, 1.5603772223598406870, 1.5467087798535034608,
92 1.5330878776675560787, 1.5195095847593707806, 1.5059690368565502602, 1.4924614237746154081,
93 1.4789819769830978546, 1.4655259573357946276, 1.4520886428822164926, 1.4386653166774613138,
94 1.4252512545068615734, 1.4118417124397602509, 1.3984319141236063517, 1.3850170377251486449,
95 1.3715922024197322698, 1.3581524543224228739, 1.3446927517457130432, 1.3312079496576765017,
96 1.3176927832013429910, 1.3041418501204215390, 1.2905495919178731508, 1.2769102735516997175,
97 1.2632179614460282310, 1.2494664995643337480, 1.2356494832544811749, 1.2217602305309625678,
98 1.2077917504067576028, 1.1937367078237721994, 1.1795873846544607035, 1.1653356361550469083,
99 1.1509728421389760651, 1.1364898520030755352, 1.1218769225722540661, 1.1071236475235353980,
100 1.0922188768965537614, 1.0771506248819376573, 1.0619059636836193998, 1.0464709007525802629,
101 1.0308302360564555907, 1.0149673952392994716, 0.99886423348064351303, 0.98250080350276038481,
102 0.96585507938813059489, 0.94890262549791195381, 0.93161619660135381056, 0.91396525100880177644,
103 0.89591535256623852894, 0.87742742909771569142, 0.85845684317805086354, 0.83895221428120745572,
104 0.81885390668331772331, 0.79809206062627480454, 0.77658398787614838598, 0.75423066443451007146,
105 0.73091191062188128150, 0.70647961131360803456, 0.68074791864590421664, 0.65347863871504238702,
106 0.62435859730908822111, 0.59296294244197797913, 0.55869217837551797140, 0.52065603872514491759,
107 0.47743783725378787681, 0.42654798630330512490, 0.36287143102841830424, 0.27232086470466385065,
111 template <
class RealType>
112 const RealType normal_table_v165<RealType>::table_y[129] = {
113 0, 0.0026696290839025035092, 0.0055489952208164705392, 0.0086244844129304709682,
114 0.011839478657982313715, 0.015167298010672042468, 0.018592102737165812650, 0.022103304616111592615,
115 0.025693291936149616572, 0.029356317440253829618, 0.033087886146505155566, 0.036884388786968774128,
116 0.040742868074790604632, 0.044660862200872429800, 0.048636295860284051878, 0.052667401903503169793,
117 0.056752663481538584188, 0.060890770348566375972, 0.065080585213631873753, 0.069321117394180252601,
118 0.073611501884754893389, 0.077950982514654714188, 0.082338898242957408243, 0.086774671895542968998,
119 0.091257800827634710201, 0.09578784912257815216, 0.10036444102954554013, 0.10498725541035453978,
120 0.10965602101581776100, 0.11437051244988827452, 0.11913054670871858767, 0.12393598020398174246,
121 0.12878670619710396109, 0.13368265258464764118, 0.13862377998585103702, 0.14361008009193299469,
122 0.14864157424369696566, 0.15371831220958657066, 0.15884037114093507813, 0.16400785468492774791,
123 0.16922089223892475176, 0.17447963833240232295, 0.17978427212496211424, 0.18513499701071343216,
124 0.19053204032091372112, 0.19597565311811041399, 0.20146611007620324118, 0.20700370944187380064,
125 0.21258877307373610060, 0.21822164655637059599, 0.22390269938713388747, 0.22963232523430270355,
126 0.23541094226572765600, 0.24123899354775131610, 0.24711694751469673582, 0.25304529850976585934,
127 0.25902456739871074263, 0.26505530225816194029, 0.27113807914102527343, 0.27727350292189771153,
128 0.28346220822601251779, 0.28970486044581049771, 0.29600215684985583659, 0.30235482778947976274,
129 0.30876363800925192282, 0.31522938806815752222, 0.32175291587920862031, 0.32833509837615239609,
130 0.33497685331697116147, 0.34167914123501368412, 0.34844296754987246935, 0.35526938485154714435,
131 0.36215949537303321162, 0.36911445366827513952, 0.37613546951445442947, 0.38322381105988364587,
132 0.39038080824138948916, 0.39760785649804255208, 0.40490642081148835099, 0.41227804010702462062,
133 0.41972433205403823467, 0.42724699830956239880, 0.43484783025466189638, 0.44252871528024661483,
134 0.45029164368692696086, 0.45813871627287196483, 0.46607215269457097924, 0.47409430069824960453,
135 0.48220764633483869062, 0.49041482528932163741, 0.49871863547658432422, 0.50712205108130458951,
136 0.51562823824987205196, 0.52424057267899279809, 0.53296265938998758838, 0.54179835503172412311,
137 0.55075179312105527738, 0.55982741271069481791, 0.56902999107472161225, 0.57836468112670231279,
138 0.58783705444182052571, 0.59745315095181228217, 0.60721953663260488551, 0.61714337082656248870,
139 0.62723248525781456578, 0.63749547734314487428, 0.64794182111855080873, 0.65858200005865368016,
140 0.66942766735770616891, 0.68049184100641433355, 0.69178914344603585279, 0.70333609902581741633,
141 0.71515150742047704368, 0.72725691835450587793, 0.73967724368333814856, 0.75244155918570380145,
142 0.76558417390923599480, 0.77914608594170316563, 0.79317701178385921053, 0.80773829469612111340,
143 0.82290721139526200050, 0.83878360531064722379, 0.85550060788506428418, 0.87324304892685358879,
144 0.89228165080230272301, 0.91304364799203805999, 0.93628268170837107547, 0.96359969315576759960,
148 template <
class RealType =
double>
151 template <
class Engine>
152 RealType operator()(Engine& eng)
158 std::pair<RealType, int> vals = generate_int_float_pair_v165<RealType, 8>(eng);
160 int sign = (i & 1) * 2 - 1;
162 RealType x = vals.first * RealType(table_x[i]);
163 if (x < table_x[i + 1])
166 return generate_tail_v165(eng) * sign;
168 RealType y01 = uniform_01<RealType>()(eng);
169 RealType y = RealType(table_y[i]) + y01 * RealType(table_y[i + 1] - table_y[i]);
172 RealType y_above_ubound, y_above_lbound;
192 y_above_ubound = RealType(table_x[i] - table_x[i + 1]) * y01 - (RealType(table_x[i]) - x);
193 y_above_lbound = y - (RealType(table_y[i]) + (RealType(table_x[i]) - x) * RealType(table_y[i]) * RealType(table_x[i]));
197 y_above_lbound = RealType(table_x[i] - table_x[i + 1]) * y01 - (RealType(table_x[i]) - x);
198 y_above_ubound = y - (RealType(table_y[i]) + (RealType(table_x[i]) - x) * RealType(table_y[i]) * RealType(table_x[i]));
201 if (y_above_ubound < 0
202 && (y_above_lbound < 0
210 static RealType f(RealType x)
213 return exp(-(x * x / 2));
221 template <
class Engine>
222 RealType generate_tail_v165(Engine& eng)
229 RealType x = exp_x(eng);
230 RealType y = exp_y(eng);
234 return x + tail_start;
258 template <
class RealType =
double>
262 typedef RealType input_type;
263 typedef RealType result_type;
277 RealType sigma_arg = RealType(1.0))
287 RealType
sigma()
const {
return _sigma; }
292 os << parm._mean <<
" " << parm._sigma;
299 is >> parm._mean >> std::ws >> parm._sigma;
306 return lhs._mean == rhs._mean && lhs._sigma == rhs._sigma;
310 BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(
param_type)
324 const RealType& sigma_arg = RealType(1.0))
325 :
_mean(mean_arg), _sigma(sigma_arg)
327 BOOST_ASSERT(_sigma >= RealType(0));
341 RealType
sigma()
const {
return _sigma; }
346 return -std::numeric_limits<RealType>::infinity();
351 return std::numeric_limits<RealType>::infinity();
360 _sigma = parm.
sigma();
370 template <
class Engine>
374 return impl(eng) * _sigma +
_mean;
378 template <
class URNG>
387 os << nd._mean <<
" " << nd._sigma;
394 is >> std::ws >> nd._mean >> std::ws >> nd._sigma;
404 return lhs._mean == rhs._mean && lhs._sigma == rhs._sigma;
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm)
param_type(RealType mean_arg=RealType(0.0), RealType sigma_arg=RealType(1.0))
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm)
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
RealType max BOOST_PREVENT_MACRO_SUBSTITUTION() const
result_type operator()(URNG &urng, const param_type &parm)
normal_distribution_v165(const RealType &mean_arg=RealType(0.0), const RealType &sigma_arg=RealType(1.0))
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(normal_distribution_v165, lhs, rhs)
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, normal_distribution_v165, nd)
normal_distribution_v165(const param_type &parm)
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, normal_distribution_v165, nd)
result_type operator()(Engine &eng)
RealType min BOOST_PREVENT_MACRO_SUBSTITUTION() const
void param(const param_type &parm)