7

I want to write a method in C# to generate a random number with gaussian distributes in range [0:1] ( and in advance in [0-x] ) . I found this code but not work correctly

Random rand = new Random(); //reuse this if you are generating many
double u1 = rand.NextDouble(); //these are uniform(0,1) random doubles
double u2 = rand.NextDouble();
double randStdNormal = Math.Abs( Math.Sqrt(-2.0 * Math.Log(u1)) * 
                                 Math.Sin(2.0 * Math.PI * u2));
Cœur
  • 37,241
  • 25
  • 195
  • 267
Yuseferi
  • 7,931
  • 11
  • 67
  • 103
  • 7
    Possible duplicate? http://stackoverflow.com/q/1303368/2065121 – Roger Rowland Apr 12 '13 at 13:49
  • @RogerRowland,no it's diff with that, I want write a simple method not a class , I found this this mehod but this method return me negative result sometimes and not precise result – Yuseferi Apr 12 '13 at 13:53
  • 6
    The difference between a "simple method" and a class is just packaging. That answer has the information you need, especially the method. Package it however you want. – Jim Mischel Apr 12 '13 at 13:57
  • @JimMischel I don't understand it, can u please wrote it in some line ,thank you – Yuseferi Apr 12 '13 at 14:05

2 Answers2

4

I wrote a blog post on how to generate random numbers with any given distribution:

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

Summing up, the algorithm you want is:

  1. Work out the desired probability distribution function such that the area under a portion of the curve is equal to the probability of a value being randomly generated in that range.
  2. Integrate the probability distribution to determine the cumulative distribution.
  3. Invert the cumulative distribution to get the quantile function.
  4. Transform your uniformly-distributed-over-(0,1) random data by running it through the quantile function.

Of course if you already know the quantile function for your desired distribution then you don't need to do steps one through three.

Eric Lippert
  • 647,829
  • 179
  • 1,238
  • 2,067
2

You say you want a generator for normally distributed (gaussian) random numbers between 0 and 1.

First of all the normal distribution is not bounded...the function you show in your example generates normally distributed random numbers with a 0.0 mean and a standard deviation of 1.0

You can generate normally distributed random values of any mean and standard deviation by multiplying the value you get from this function times the desired standard deviation and then adding the desired mean...

The code is OK as is - the problem is a misunderstanding of the gaussian (normal) distribution which has a range of -inf to +inf...

about 2/3 of the time the value you get will be between +/- 1 standard deviation....about 95% of the time the value will be between +/1 3 times the standard deviation...

MaxCulpa
  • 21
  • 1