PHP - rand(1,1000)= 1000可能与rand(1,1000)= rand(1,1000)?

时间:2009-08-16 15:13:26

标签: php random

这是PHP实现随机数生成的方式吗?

说我想计算是或否。每次我都有一定的概率百分比(例如:这个例子为0,05%)。

我做:

$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;

是否使用任一选项提供相同的结果?

7 个答案:

答案 0 :(得分:11)

让数据说明一切。

代码

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";
?>

试运行

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

鉴于上述结果,我会说,出于所有实际目的,两个选项都是等价的,给出了两个案例的预期1/1000结果。

答案 1 :(得分:8)

是的,rand(1,1000)= 1000与rand(1,1000)= rand(1,1000)一样可能。

想象一下滚动两个骰子。滚动第一个之后,第二个滚动时第二个与第一个相等的概率是多少? 1/6。

现在记下1到6之间的数字并掷骰子。骰子与你刚才写的相等的概率是多少? 1/6。

答案 2 :(得分:3)

IF 随机数生成器是真正随机的,然后两种方法产生相同的结果。但是,计算机随机数发生器并不完美。我怀疑这些缺陷是否足够重要,但唯一可以确定的方法就是尝试 - 尽可能长时间地进行测试,看看是否存在偏差。你至少需要数百万的随机数。

答案 3 :(得分:2)

这并不直接解决您的问题,但您可能希望查看mt_rand()。 PHP文档声明:

  

许多较旧的随机数生成器   libcs​​有可疑或未知   特征并且很慢。通过   默认情况下,PHP使用libc随机   rand()的数字生成器   功能。 mt_rand()函数是一个   直接替代这个。它用   已知的随机数发生器   使用»Mersenne的特征   Twister,会随机产生   数字比什么快4倍   平均libc rand()提供。

来自http://www.php.net/manual/en/function.mt-rand.php

答案 4 :(得分:1)

大多数随机生成器工作的方式,输出不是真正随机的,而是基于一个算法,该算法应该使返回的值看起来是随机的和分布式的。基于此,我认为如果你有两个完全不相关的“随机生成器”,你实际连续两次获得相同数字的真实概率甚至比现实世界还要少。

编辑:说过我没有关于php中默认随机生成器如何工作的内幕信息。

答案 5 :(得分:0)

保证选项1是正确的。

我认为我当天没有学到足够的概率和统计数据来说明选项2是否正确。

但是,我确实知道,如果没有在其上运行测试程序,就不应该相信其他人的随机数生成器,以了解它真正的随机性。

在您的情况下,我会通过两个选项运行几百万个测试用例,并查看选项2是否提供了与选项1类似的统计信息。

答案 6 :(得分:-4)

理论上,是的,这两个表达式具有完全相同的可能性。这假设PHP的随机数生成器实际上是随机的 - 如果不是,那么一个将比另一个更可能。

最好的方法是运行一个实验(数千次迭代),看看会发生什么。