From a8dd594369a0ec9cfd380a844afdac90c833ab1e Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Wed, 21 May 2014 17:24:30 +0100
Subject: [PATCH] [Add] Using confidence intervals now.

---
 src/economy.c |  3 +--
 src/rng.h     | 27 +++++++++++++++++++++------
 src/space.c   |  4 ++--
 src/weapon.c  |  6 ++----
 4 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/src/economy.c b/src/economy.c
index 2d7f084..7cc4df8 100644
--- a/src/economy.c
+++ b/src/economy.c
@@ -302,8 +302,7 @@ static double econ_calcSysI(unsigned int dt, StarSystem* sys, int price) {
        */
       prodfactor = planet->cur_prodfactor;
       /* Add a variability factor based on the gaussian distribution. */
-      prodfactor += ECON_PROD_VAR *
-        NormalInverse(RNGF()*0.90 + 0.05)*ddt;
+      prodfactor += ECON_PROD_VAR * RNG_2SIGMA() * ddt;
       /* Add a tendency to return to the planets base production. */
       prodfactor -= ECON_PROD_VAR *
         (planet->cur_prodfactor - prodfactor)*ddt;
diff --git a/src/rng.h b/src/rng.h
index 2f36cf6..a1932a7 100644
--- a/src/rng.h
+++ b/src/rng.h
@@ -1,8 +1,6 @@
 #pragma once
 
 /**
- * @def RNG(L,H)
- *
  * @brief Get a random number between L and H (L <= RNG <= H).
  *
  * If L is bigger than H it inverts the roles.
@@ -10,8 +8,6 @@
 #define RNG(L,H)       (((L)>(H)) ? RNG_SANE((H), (L)) : RNG_SANE((L),(H)))
 
 /**
- *  @def RNG_SANE(L,H) 
- *
  *  @brief Get a number between L and H (L <= RNG <= H).
  *
  *  Result unspecified if L is bigger than H.
@@ -19,12 +15,31 @@
 #define RNG_SANE(L,H)  ((int)L + (int)((double)(H-L+1) * randfp())) /* L <= RNG <= H */
 
 /**
- * @def RNGF()
- *
  * @brief Get a random float between 0 and 1 (0. <= RNGF <= 1.).
  */
 #define RNGF()  (randfp()) /* 0. <= RNGF <= 1. */
 
+/**
+ * @brief Get a random mu within one-sigma (-1 to 1).
+ * 
+ * 63% Confidence interval.
+ */
+#define RNG_1SIGMA()    NormalInverse(0.158 + RNGF()*(1.-0.341*2.))
+
+/**
+ * @brief Get a random mu withing two-sigma(-2 to 2)
+ *
+ * 95% confidence interval.
+ */
+#define RNG_2SIGMA()    NormalInverse(0.021 + RNGF()*(1.-0.021*2.))
+
+/**
+ * @brief Get a random mu within three sigma (-3 to 3).
+ *
+ * 99.8% Confidence interval.
+ */
+#define RNG_3SIGMA()    NormalInverse(0.001 + RNGF()*(1.-0.001*2.))
+
 /* Init. */
 void rng_init(void);
 
diff --git a/src/space.c b/src/space.c
index 9466865..53e5d10 100644
--- a/src/space.c
+++ b/src/space.c
@@ -462,9 +462,9 @@ void space_update(const double dt) {
       interference_timer -= dt;
       if(interference_timer < 0.) {
         interference_timer += (1000. - cur_system->interference) / 1000. *
-          (3. + NormalInverse(0.25 + 0.95*RNGF()));
+          (3. + RNG_2SIGMA());
         interference_target = cur_system->interference/1000. * 2. *
-          (1. + NormalInverse(0.25 + 0.95*RNGF()));
+          (1. + RNG_2SIGMA());
       }
 
       /* Head towards target. */
diff --git a/src/weapon.c b/src/weapon.c
index a77b35f..cc846ce 100644
--- a/src/weapon.c
+++ b/src/weapon.c
@@ -775,10 +775,8 @@ static Weapon* weapon_create(const Outfit* outfit, const double dir, const Vec2*
       } else /* Fire straight. */
         rdir = dir;
 
-      rdir += NormalInverse(RNGF()*0.9 + 0.05) /* Get rid of extreme values. */
-        * outfit->u.blt.accuracy/2. * 1./180.0*M_PI;
-
-    if((rdir > 2.*M_PI) || (rdir < 0.)) rdir = fmod(rdir, 2.*M_PI);
+      rdir += RNG_2SIGMA() * outfit->u.blt.accuracy/2. * 1./180.*M_PI;
+      if((rdir > 2.*M_PI) || (rdir < 0.)) rdir = fmod(rdir, 2.*M_PI);
 
     mass = 1; /* Lasers are presumed to have unitory mass. */
     vectcpy(&v, vel);