I need a random number generator that generates random numbers with a uniform distribution. I am not sure what rand does in ruby and I can't seem to find it online either. My initial assumption is that it follows a uniform distribution, but I can't tell. Any ideas?

on 2007-05-22 21:34

on 2007-05-22 21:55

On 5/22/07, Roland Mai <roland.mai@gmail.com> wrote: > I need a random number generator that generates random numbers with a > uniform distribution. > > I am not sure what rand does in ruby and I can't seem to find it online > either. My initial assumption is that it follows a uniform distribution, but > I can't tell. > > Any ideas? > According to the source code for random.c, Ruby's implementation of rand uses the Mersenne Twister MT19937 which according to: http://en.wikipedia.org/wiki/Mersenne_twister has "a very high order of dimensional equidistribution." HTH -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/

on 2007-05-22 21:57

Roland Mai wrote: > I need a random number generator that generates random numbers with a > uniform distribution. > > I am not sure what rand does in ruby and I can't seem to find it online > either. My initial assumption is that it follows a uniform distribution, > but > I can't tell. > > Any ideas? > Well, I would think that by definition it has a uniform distribution. Can you give an example of a RNG that does not have a uniform distribution?

on 2007-05-22 22:00

Roland Mai wrote: > I need a random number generator that generates random numbers with a > uniform distribution. > > I am not sure what rand does in ruby and I can't seem to find it online > either. My initial assumption is that it follows a uniform distribution, > but > I can't tell. > > Any ideas? Yes, rand() is uniform in the interval 0 <= x < 1. It's based on MT19937. If you have a working ri installation, then you can read about it this way: $ ri Kernel#rand | cat ------------------------------------------------------------ Kernel#rand rand(max=0) => number ------------------------------------------------------------------------ Converts max to an integer using max1 = max.to_i.abs. If the result is zero, returns a pseudorandom floating point number greater than or equal to 0.0 and less than 1.0. Otherwise, returns a pseudorandom integer greater than or equal to zero and less than max1. Kernel::srand may be used to ensure repeatable sequences of random numbers between different runs of the program. Ruby currently uses a modified Mersenne Twister with a period of 219937-1. srand 1234 #=> 0 [ rand, rand ] #=> [0.191519450163469, 0.49766366626136] [ rand(10), rand(1000) ] #=> [6, 817] srand 1234 #=> 1234 [ rand, rand ] #=> [0.191519450163469, 0.49766366626136]

on 2007-05-22 23:01

Dan Zwell wrote: >> > > Well, I would think that by definition it has a uniform distribution. > Can you give an example of a RNG that does not have a uniform distribution? > An RNG defined such that its output is the average of the outputs of N independent uniform RNG's will, if my very, very shaky memory of first year undergrad maths can be relied upon, have a Gaussian distribution. That's the simplest I can think of...

on 2007-05-23 00:02

Dan Zwell wrote: > Well, I would think that by definition it has a uniform distribution. > Can you give an example of a RNG that does not have a uniform > distribution? The stat software I use has RNGs for the Bernoulli, beta, binomial, Cauchy, chi-square, Erlang, exponential, F, gamma, geometric, hypergeometric, lognormal, negative binomial, normal, poisson, T, tabled, triangular, and Weibull distributions, as well as uniform.

on 2007-05-23 00:28

On 5/22/07, Dan Zwell <dzwell@gmail.com> wrote: > > > > Well, I would think that by definition it has a uniform distribution. > Can you give an example of a RNG that does not have a uniform distribution? > > http://xkcd.com/c221.html Just Kidding. -Harold

on 2007-05-23 00:54

You can use uniform random numbers generated from the GNU Scientific library, via ruby-gsl, http://rb-gsl.rubyforge.org/, see : http://rb-gsl.rubyforge.org/rng.html, if you should want random numbers that follow some other distribution, you can always pick a random number in the interval [0,1] and then numerically find the position at which the cumulative distribution reaches this value. Do this many times .. this gives you a distribution of points according to the distribution you're looking for. You don't have to program it all by yourself, but you can use the statistics2 package by Shin-ichiro Hara: see the readme here: http://blade.nagaokaut.ac.jp/~sinara/ruby/math/sta... Best regards, Axel

on 2007-05-23 08:40

Tim Hunter wrote: > Dan Zwell wrote: >> Well, I would think that by definition it has a uniform distribution. >> Can you give an example of a RNG that does not have a uniform >> distribution? > > The stat software I use has RNGs for the Bernoulli, beta, binomial, > Cauchy, chi-square, Erlang, exponential, F, gamma, geometric, > hypergeometric, lognormal, negative binomial, normal, poisson, T, > tabled, triangular, and Weibull distributions, as well as uniform. > I guess that was a pretty dumb question. But I'm glad I asked it, as I have never pondered RNGs that aren't uniform. I'll probably learn about the algorithms that generate these other distributions if I ever have time.

on 2007-05-23 17:09

On 5/23/07, Dan Zwell <dzwell@gmail.com> wrote: > > > I guess that was a pretty dumb question. But I'm glad I asked it, as I > have never pondered RNGs that aren't uniform. I'll probably learn about > the algorithms that generate these other distributions if I ever have time. Most of these are based on a uniform RNG. They either apply a function to one or more numbers generated by a uniform random number generator. Or they use a series of uniform RNs to do a mini-simulation and in the process generate the required result. -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/