Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP - Is rand(1,1000) = 1000 as probable as rand(1,1000) = rand(1,1000)?

Tags:

php

random

Is this how PHP implemented random number generating?

Say I want to calculate a yes or a no. Everytime I have a certain probability percentage (say: 0,05% for this example).

I do:

$possibilities = 100 / $probabilityPercentage; //$possibilities = 2000
$yes = rand(1,$possibilities);

$yesCheck = $possiblities;            //OPTION 1
$yesCheck = rand(1,$possibilities);   //OPTION 2


($yesCheck == $yes) ? return true : return false;

Does it give the same results with either option?

like image 500
Ropstah Avatar asked Aug 16 '09 15:08

Ropstah


3 Answers

Let the data speak for itself.

Code

vinko@parrot:~$ more rand.php
<?php

$randrandsum = 0;
$randconstsum = 0;
$count = 20;
for ($j = 0; $j < $count; $j++) {
        $randrand = 0;
        $randconst = 0;
        for ($i = 0; $i < 10000000; $i++ ){
                $a = rand(1,1000);
                $b = rand(1,1000);
                if ($a == $b) $randrand++;
        }
        for ($i = 0; $i < 10000000; $i++ ){
                $a = rand(1,1000);
                $c = 1000;
                if ($c == $a) $randconst++;
        }
        $randrandsum += $randrand;
        $randconstsum += $randconst;
        print ($j+1)." RAND-RAND: $randrand RAND-CONST: $randconst\n";
}
print "AVG RAND-RAND: ".($randrandsum/$count);
print " AVG RAND-CONST: ".($randconstsum/$count)."\n";
?>

Test run

vinko@parrot:~$ php rand.php
1 RAND-RAND: 10043 RAND-CONST: 10018
2 RAND-RAND: 9940 RAND-CONST: 10132
3 RAND-RAND: 9879 RAND-CONST: 10042
4 RAND-RAND: 9878 RAND-CONST: 9965
5 RAND-RAND: 10226 RAND-CONST: 9867
6 RAND-RAND: 9866 RAND-CONST: 9992
7 RAND-RAND: 10069 RAND-CONST: 9953
8 RAND-RAND: 9967 RAND-CONST: 9862
9 RAND-RAND: 10009 RAND-CONST: 10060
10 RAND-RAND: 9809 RAND-CONST: 9985
11 RAND-RAND: 9939 RAND-CONST: 10057
12 RAND-RAND: 9945 RAND-CONST: 10013
13 RAND-RAND: 10090 RAND-CONST: 9936
14 RAND-RAND: 10000 RAND-CONST: 9867
15 RAND-RAND: 10055 RAND-CONST: 10088
16 RAND-RAND: 10129 RAND-CONST: 9875
17 RAND-RAND: 9846 RAND-CONST: 10056
18 RAND-RAND: 9961 RAND-CONST: 9930
19 RAND-RAND: 10063 RAND-CONST: 10001
20 RAND-RAND: 10047 RAND-CONST: 10037
AVG RAND-RAND: 9988.05 AVG RAND-CONST: 9986.8

Given the above results I'd say that for all practical purposes, both options are equivalent, giving the expected 1/1000 result on both cases.

like image 57
Vinko Vrsalovic Avatar answered Sep 24 '22 04:09

Vinko Vrsalovic


Yes, rand(1,1000) = 1000 is just as probable as rand(1,1000) = rand(1,1000).

Imagine rolling two dices. After you rolled the first one, what is the probability the second one will equal the first when rolled? 1/6.

Now write down a number between 1 and 6 and roll a dice. What is the probability the dice will equal what you have just written? 1/6.

like image 38
Kasper Marstal Avatar answered Sep 23 '22 04:09

Kasper Marstal


IF the random number generator is truly random then both approaches produce the same result. However, computer random number generators aren't perfect. I doubt the flaws are enough to matter but the only way to know for sure is to try it--run a test for as long as possible and see if there is a deviation from what it should be. You'll need millions of random numbers at a minimum.

like image 3
Loren Pechtel Avatar answered Sep 21 '22 04:09

Loren Pechtel