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 
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 
double pMean
Definition: Normal.h:26
double cachedNormal
Definition: Normal.h:23
double pStdDev
Definition: Normal.h:28
char haveCachedNormal
Definition: Normal.h:22
virtual double operator()()
Definition: Normal.cpp:28
RNG * pGenerator
Definition: Random.h:26
sqrt
Definition: extdef.h:3
log
Definition: extdef.h:4