title: How to generate normally distributed random from an integer range?
body: <p>Given the start and the end of an integer range, how do I calculate a normally distributed random integer between this range?</p>
  
  <p>I realize that the normal distribution goes into -+ infinity. I guess the tails can be cutoff, so when a random gets computed outside the range, recompute. This elevates the probability of integers in the range, but as long as the this effect is tolerable (&lt;5%), it's fine.</p>
  
  <pre><code>public class Gaussian
  {
      private static bool uselast = true;
      private static double next_gaussian = 0.0;
      private static Random random = new Random();
  
      public static double BoxMuller()
      {
          if (uselast) 
          { 
              uselast = false;
              return next_gaussian;
          }
          else
          {
              double v1, v2, s;
              do
              {
                  v1 = 2.0 * random.NextDouble() - 1.0;
                  v2 = 2.0 * random.NextDouble() - 1.0;
                  s = v1 * v1 + v2 * v2;
              } while (s &gt;= 1.0 || s == 0);
  
              s = System.Math.Sqrt((-2.0 * System.Math.Log(s)) / s);
  
              next_gaussian = v2 * s;
              uselast = true;
              return v1 * s;
          }
      }
  
      public static double BoxMuller(double mean, double standard_deviation)
      {
          return mean + BoxMuller() * standard_deviation;
      }
  
      public static int Next(int min, int max)
      {
          return (int)BoxMuller(min + (max - min) / 2.0, 1.0); 
      }
  }
  </code></pre>
  
  <p>I probably need to scale the standard deviation some how relative to the range, but don't understand how.</p>
  
  <p>Answer:</p>
  
  <pre><code>    // Will approximitely give a random gaussian integer between min and max so that min and max are at
      // 3.5 deviations from the mean (half-way of min and max).
      public static int Next(int min, int max)
      {
          double deviations = 3.5;
          int r;
          while ((r = (int)BoxMuller(min + (max - min) / 2.0, (max - min) / 2.0 / deviations)) &gt; max || r &lt; min)
          {
          }
  
          return r;
      }
  </code></pre>