Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Answer: How do I get random numbers that follow standard distribution?

by grackle (Acolyte)
on Aug 09, 2000 at 07:41 UTC ( #26946=categorized answer: print w/replies, xml ) Need Help??

Q&A > math > How do I get random numbers that follow standard distribution? - Answer contributed by grackle

The question posted asks for a non-module solution, and an excellent one was provided by lhoward and tilly. Here is a solution using a CPAN module.

I looked for Math::Random on CPAN and couldn't find it. There are modules for random numbers, such as Crypt::TrulyRandom, but I believe they will only give you better uniformly distributed random variables (correct me if I'm wrong). For a normal distribution, you can use Math::CDF (Cumulative Distribution Functions). The relevant function is Math::CDF::qnorm(), which will give you what you want when fed a random number x, 0<x<1, with a uniform distribution (i.e., what you get from rand()). (It supposedly returns a value for the inputs x=1 and x=0, but I don't know what those values could be, you'll have to try it).

So the function you want is:

$myrand = qnorm(rand());

(or replace rand() with your function of choice).

One caveat: I don't know how the Math::CDF module calculates these values. If it provides more precision than you need, it could be a big waste of processing time. In that case lhoward and tilly's solution, summing several random variables, works fine. It would be nice to have bounds for the errors, but I can't help you there. Calculate, experiment, or find a reference.... Perhaps this would be a good place to post the results.

  • Comment on Answer: How do I get random numbers that follow standard distribution?
Replies are listed 'Best First'.
RE: Answer: How do I get random numbers that follow standard distribution?
by tilly (Archbishop) on Aug 10, 2000 at 15:55 UTC
    You misunderstood one thing. The point of Math::TrulyRandom is not to have a more accurate distribution, it is to have a random number that is not guessable. Normal random numbers are guessable based on the time your program runs.

    If the random numbers are used for any cryptographic purpose this is an important consideration.

Erratum
by grackle (Acolyte) on Aug 09, 2000 at 07:46 UTC
    The following sentence was truncated due to author error:

    The relevant function is Math::CDF::qnorm(), which will give you what you want when fed a random number x, 0 < x < 1.

    My apologies.

    All exact science is dominated by the idea of approximation.
    -- Bertrand Russell

Log In?
Username:
Password:

What's my password?
Create A New User
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (5)
As of 2020-10-28 01:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (259 votes). Check out past polls.

    Notices?