Module: Distribution::Normal::Ruby_
- Defined in:
- lib/distribution/normal/ruby.rb
Class Method Summary collapse
-
.cdf(z) ⇒ Object
Normal cumulative distribution function (cdf).
-
.pdf(x) ⇒ Object
Normal probability density function (pdf) With x=0 and sigma=1.
-
.quantile(qn) ⇒ Object
(also: p_value)
Return the inverse CDF or P-value of the corresponding integral.
-
.rng(mean = 0, sigma = 1, seed = nil) ⇒ Object
Return a Proc object which returns a random number drawn from the normal distribution with mean +mean+ and standard deviation +sigma+, i.e.
-
.rngu ⇒ Object
random number within a gaussian distribution X ~ N(0,1).
Class Method Details
.cdf(z) ⇒ Object
Normal cumulative distribution function (cdf).
Returns the integral of normal distribution over (-Infty, z].
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/distribution/normal/ruby.rb', line 58 def cdf(z) return 0.0 if z < -12 return 1.0 if z > 12 return 0.5 if z == 0.0 if z > 0.0 e = true else e = false z = -z end z = z.to_f z2 = z * z t = q = z * Math.exp(-0.5 * z2) / SQ2PI 3.step(199, 2) do |i| prev = q t *= z2 / i q += t return(e ? 0.5 + q : 0.5 - q) if q <= prev end e ? 1.0 : 0.0 end |
.pdf(x) ⇒ Object
Normal probability density function (pdf) With x=0 and sigma=1
49 50 51 |
# File 'lib/distribution/normal/ruby.rb', line 49 def pdf(x) (1.0 / SQ2PI) * Math.exp(-(x**2 / 2.0)) end |
.quantile(qn) ⇒ Object Also known as: p_value
Return the inverse CDF or P-value of the corresponding integral
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/distribution/normal/ruby.rb', line 83 def quantile(qn) b = [1.570796288, 0.03706987906, -0.8364353589e-3, -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5, -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8, 0.3657763036e-10, 0.6936233982e-12] if qn < 0.0 || 1.0 < qn $stderr.printf("Error : qn <= 0 or qn >= 1 in pnorm()!\n") return 0.0 end qn == 0.5 and return 0.0 w1 = qn w3 = -Math.log(4.0 * w1 * (1.0 - w1)) w1 = b[0] 1.upto 10 do |i| w1 += b[i] * w3**i end qn > 0.5 and return Math.sqrt(w1 * w3) -Math.sqrt(w1 * w3) end |
.rng(mean = 0, sigma = 1, seed = nil) ⇒ Object
Return a Proc object which returns a random number drawn from the normal distribution with mean +mean+ and standard deviation +sigma+, i.e. from N(+mean+,+sigma+^2).
== Arguments
- +mean+ - mean of the normal distribution
- +sigma+ - standard deviation, a strictly positive number
- +seed+ - seed, an integer value to set the initial state
== Reference
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/distribution/normal/ruby.rb', line 17 def rng(mean = 0, sigma = 1, seed = nil) seed = Random.new_seed if seed.nil? r = Random.new(seed) returned = 0 y1 = 0 y2 = 0 lambda do if returned == 0 begin x1 = 2.0 * r.rand - 1.0 x2 = 2.0 * r.rand - 1.0 w = x1 * x1 + x2 * x2 end while (w >= 1.0) w = Math.sqrt((-2.0 * Math.log(w)) / w) y1 = x1 * w y2 = x2 * w returned = 1 y1 * sigma + mean else returned = 0 y2 * sigma + mean end end end |
.rngu ⇒ Object
random number within a gaussian distribution X ~ N(0,1)
43 44 45 |
# File 'lib/distribution/normal/ruby.rb', line 43 def rngu rng(0, 1, nil) end |