|generating random numbers between 0 and 1|
| 10:34 pm on Nov 17, 2009 (gmt 0)|
I'm trying to write a small statistical procedure, and I need random numbers between 0 and 1 evenly distributed.
rand(0,1) and mt_rand(0,1) are both causing me problems. They both seem to return either 0 or 1. I'm not sure if there is some setting my web host has so that the numbers are rounded or what.
I also tried rand( 0, getrandmax()/getrandmax() ) with no luck.
here is the function I'm writing:
$a = mt_rand(0,1);
$b = mt_rand(0,1);
$bm = sqrt( -2 * log($a) ) * cos( 2 * pi() * $b);
In case anyone is curious, Box Muller is a way to generate a standard normal distribution.
| 12:19 am on Nov 18, 2009 (gmt 0)|
Well, look at the documentation for rand [us.php.net]:
Note how the return value is an integer. So of course you aren't getting a float.
|int rand (int $min, int $max) |
rand(0, getrandmax()/getrandmax()) is closer (you want to divide something by getrandmax()), but think about what it does: it divides getrandmax() by itself, so is equivalent to saying rand(0, 1). To compress a random number between 0 and MAX to be between 0 and 1, you need to divide the random number itself by MAX.
| 2:04 am on Nov 18, 2009 (gmt 0)|
Wow, I feel silly. Thanks. I get sloppy with PHP since it isn't typed as strongly as C++.
| 2:42 am on Nov 18, 2009 (gmt 0)|
Not sure what to tell you about the 'evenly distributed' portion (you could probably accomplish it by storing rotating through a series of 10 possibilities and loop through them, EG 1000000, 1999999 ¦ 2000000, 2999999 ¦ etc.), and you can easily have control over the length of the decimal as follows:
$number = mt_rand(1000000,9999999);
echo gettype ($number);
Not sure if it helps or not...
| 3:15 am on Nov 18, 2009 (gmt 0)|
Generally, the rand() functions in various languages are pretty even. Now that my Box Muller function is working, the results from the Monte Carlo simulation are spot on with what I was getting from running the sim in MS Excel. So that is, as they say, good enough for government work!
Thanks for the help!