I Generating a random sample with a standard deviation

1. Aug 11, 2017

gamow99

I'm trying to write a computer program which generates a random list of numbers but the random numbers form a bell curve, that is, there is a mean and a standard deviation from that mean. I'm not interested in some function that gets the job done, rather I'm trying to understand how do you generate a random list of numbers which are not entirely but conform to a bell curve. I have already done the following in Python:

list5 = [5] * 8
list4 = [4,5,6] * 4
list3 = [3,4,5,6,7] * 2
list2 = [x for x in range(2,9)]
list1 = [x for x in range(1,11)]
list6 = list1 + list2 + list3 + list4 + list5

So in the above 5 appears 8 times more often often 1,2,9,10. 4 times more often than 3 and 4 and twice as often as 4 and 6 which does form a bell curve and then I just select randomly from list 6. But I don't like that solution.

2. Aug 11, 2017

Staff: Mentor

3. Aug 11, 2017

FactChecker

There are two problems of pseudo-random numbers that can be handled independently. The first is that the series of numbers should have as little detectable autocorrelations as possible. The second is to get the desired sample distribution. If the first problem is solved for generating a uniform distribution of numbers in [0,1), then there are several ways to use that to solve the second problem.

There has been a great deal of work done to solve both problems. An excellent reference is Knuth, The Art of Computer Programming, Vol 2: Seminumerical Algorithms. Chapter 3, Random Numbers. (Knuth's series of books is almost a bible for computer programmers.)

I do not advise you to try your own uniform random number generator unless you are prepared to learn a lot of number theory concepts.
The easiest, most versatile, brute-force method to solve the second problem is to use "rejection sampling". See https://en.wikipedia.org/wiki/Rejection_sampling. For the special case of the normal distribution there are several other techniques. A popular one is to use the Box-Muller transformation (see http://www.design.caltech.edu/erik/Misc/Gaussian.html). Mathworks uses other techniques in their MATLAB normrnd function, which they document reasonably well (see https://www.mathworks.com/company/newsletters/articles/normal-behavior.html )

4. Aug 31, 2017

ssd

Suppose, f(x)= f(x,μ,σ) is your curve with known mean (μ) and sd (σ) and f(x)≥0. Find C=∫Xf(x)dx, -∞<x<∞. Draw a 3 digited (say) random number and put a decimal point before it. Let this fraction be R. Find x by solving ∫-∞x f(x)dx/c =R. x is now a sample form f(x).

5. Aug 31, 2017

FactChecker

If the cumulative distribution function is invertible, this is a great method. It's called the inverse transform method (see https://en.wikipedia.org/wiki/Inverse_transform_sampling )

6. Sep 1, 2017

ssd

More often than not, inverse function of a CDF is not analytically solvable in terms of simple functions. We have to use a computer program for numerical solution.