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



1至9999之间的PHP rand(min, max)几乎所有结果都带有4位数字(因为有4位数字的数字的〜90%)。因此,如果我跑了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);

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

这正是统一分布的工作方式。没有开箱即用的功能可以做您追求的事情,因此您必须制作一些统计信息。

我所想的是:生成0到1之间的随机数,如果它在0到.25之间,则在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