它不会是一个统一的分布(而且你没有指定它需要是)。
对于最简单的解决方案,您不需要进行缩放或循环,您可以将随机 1 到 5,然后添加随机 0 到 2;
function getMoreRandom()
{
return getRandom() + getRandom() % 3;
}
快速测试看看分布是什么样的:
$results = array_fill(1, 7, 0);
for ($i = 0; $i < 1000000; $i++) {
$results[rand(1,5) + rand(1,5) % 3]++;
}
var_dump($results);
如前所述,并非设计为均匀随机。
array(7) {
[1]=>
int(39550) // 4%
[2]=>
int(120277) // 12%
[3]=>
int(200098) // 20%
[4]=>
int(199700) // 20%
[5]=>
int(200195) // 20%
[6]=>
int(160200) // 16%
[7]=>
int(79980) // 8%
}
稍微复杂一点,和@flovs 不同的方法(我不喜欢他的循环可能永远持续的方式 - 嘿,这就是随机性)
function getMoreRandom()
{
for (
$i = 0, $v = 0;
$i < 7;
$i++, $v += getRandom()
);
return $v % 7 + 1;
}
这会产生均匀分布
array(7) {
[1]=>
int(14397)
[2]=>
int(14218)
[3]=>
int(14425)
[4]=>
int(14116)
[5]=>
int(14387)
[6]=>
int(14256)
[7]=>
int(14201)
}