NEURON
Normal.cpp
Go to the documentation of this file.
1
/*
2
Copyright (C) 1988 Free Software Foundation
3
written by Dirk Grunwald (grunwald@cs.uiuc.edu)
4
5
This file is part of the GNU C++ Library. This library is free
6
software; you can redistribute it and/or modify it under the terms of
7
the GNU Library General Public License as published by the Free
8
Software Foundation; either version 2 of the License, or (at your
9
option) any later version. This library is distributed in the hope
10
that it will be useful, but WITHOUT ANY WARRANTY; without even the
11
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12
PURPOSE. See the GNU Library General Public License for more details.
13
You should have received a copy of the GNU Library General Public
14
License along with this library; if not, write to the Free Software
15
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
16
*/
17
#ifdef __GNUG__
18
#pragma implementation
19
#endif
20
#include "
Random.h
"
21
#include "
Normal.h
"
22
//
23
// See Simulation, Modelling & Analysis by Law & Kelton, pp259
24
//
25
// This is the ``polar'' method.
26
//
27
28
double
Normal::operator()
()
29
{
30
31
if
(
haveCachedNormal
== 1) {
32
haveCachedNormal
= 0;
33
return
(
cachedNormal
*
pStdDev
+
pMean
);
34
}
else
{
35
36
for
(;;) {
37
double
u1 =
pGenerator
-> asDouble();
38
double
u2 =
pGenerator
-> asDouble();
39
double
v1 = 2 * u1 - 1;
40
double
v2 = 2 * u2 - 1;
41
double
w = (v1 * v1) + (v2 * v2);
42
43
//
44
// We actually generate two IID normal distribution variables.
45
// We cache the one & return the other.
46
//
47
if
(w <= 1) {
48
double
y =
sqrt
( (-2 *
log
(w)) / w);
49
double
x1 = v1 * y;
50
double
x2 = v2 * y;
51
52
haveCachedNormal
= 1;
53
cachedNormal
= x2;
54
return
(x1 *
pStdDev
+
pMean
);
55
}
56
}
57
}
58
}
59
Normal.h
Random.h
Normal::pMean
double pMean
Definition:
Normal.h:26
Normal::cachedNormal
double cachedNormal
Definition:
Normal.h:23
Normal::pStdDev
double pStdDev
Definition:
Normal.h:28
Normal::haveCachedNormal
char haveCachedNormal
Definition:
Normal.h:22
Normal::operator()
virtual double operator()()
Definition:
Normal.cpp:28
Random::pGenerator
RNG * pGenerator
Definition:
Random.h:26
sqrt
sqrt
Definition:
extdef.h:3
log
log
Definition:
extdef.h:4
src
gnu
Normal.cpp