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

Rop*_*tah 7 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;
Run Code Online (Sandbox Code Playgroud)

两种选择都能给出相同的结果吗?

Vin*_*vic 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";
?>
Run Code Online (Sandbox Code Playgroud)

测试运行

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
Run Code Online (Sandbox Code Playgroud)

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

  • +1,虽然我必须用http://www.dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/2000/300/2318/2318回答你的"让数据说不出话来". strip.gif (2认同)
  • 这种测试方法确实不正确,因为它总是在每次迭代中调用两次rand().更准确的测试将运行一个循环测试rand(1,1000)== 1000和第二个循环测试rand(1,1000)== rand(1,1000). (2认同)

小智 8

是的,rand(1,1000)= 1000和rand(1,1000)= rand(1,1000)一样可能.

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

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