一様分布にはなりません(そして、一様分布である必要があることを指定しません)。
最も単純な解決策では、スケーリングやループを行う必要はありません。ランダムな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)
}