PHP随机INT具有均匀分布的数量级结果

时间:2017-10-01 04:33:11

标签: php

PHP rand(min, max)介于1和9999之间,几乎所有结果都是4位数(因为有大约90%的数字有4位数)。所以,如果我跑了1000次,大约90%的人可能会有4位数。

有没有办法从1到9999生成一个随机INT,并且输出数字有相同的机会有1,2,3或4位而不用手动操作?

通过手动操作,我的意思是:

$digits = rand(1, 4);
$num = '';

for($i = 0; $i < $digits; $i++){
    $num .= rand(0, 9);
}

$final = intval($num);

1 个答案:

答案 0 :(得分:4)

  

所以,如果我跑1000次,大约90%的人可能会有4位数。

这就是统一分布的工作原理。没有开箱即用功能可以完成您之后的操作,因此您必须制作一些统计数据。

我想到的是:生成0到1之间的随机数。如果它在0到0.25之间,则生成0到9之间的另一个随机数。如果它在0到9之间。 .25和.5,生成10到99之间的另一个随机数,依此类推。然后,您有1/4的机会获得每个数量级。

这显然会偏向较低的数字,因为它们的数量较少。例如,1的机会为25% / 10 = 2.5%,而1001的机会为25% / 8998 = 0.00277%

它是这样的:

<?php
$initial = rand(0, 100)/100;
if ($initial < .25) {
    $random = rand(0, 9);
}
elseif ($initial < .5) {
    $random = rand(10, 99);
}
elseif ($initial < .75) {
    $random = rand(100, 999);
}
elseif ($initial >= .75) {
    $random = rand(1000, 9999);
}
var_dump($random);

Demo