这是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;
是否使用任一选项提供相同的结果?
答案 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()提供。
答案 4 :(得分:1)
大多数随机生成器工作的方式,输出不是真正随机的,而是基于一个算法,该算法应该使返回的值看起来是随机的和分布式的。基于此,我认为如果你有两个完全不相关的“随机生成器”,你实际连续两次获得相同数字的真实概率甚至比现实世界还要少。
编辑:说过我没有关于php中默认随机生成器如何工作的内幕信息。
答案 5 :(得分:0)
保证选项1是正确的。
我认为我当天没有学到足够的概率和统计数据来说明选项2是否正确。
但是,我确实知道,如果没有在其上运行测试程序,就不应该相信其他人的随机数生成器,以了解它真正的随机性。在您的情况下,我会通过两个选项运行几百万个测试用例,并查看选项2是否提供了与选项1类似的统计信息。
答案 6 :(得分:-4)
理论上,是的,这两个表达式具有完全相同的可能性。这假设PHP的随机数生成器实际上是随机的 - 如果不是,那么一个将比另一个更可能。
最好的方法是运行一个实验(数千次迭代),看看会发生什么。