PHP:如何以相同的概率将值分配给变量?

时间:2017-09-07 12:49:24

标签: php math probability-distribution

主持人注意:这不是家庭作业。

我有以下示例:

$points = 10;
$a = 0;
$b = 0;
$c = 0;
$d = 0;

我想将点随机分配到变量($ a,$ b,$ c,$ d),直到$ points达到零。因此,运行某些函数/脚本后的预期随机输出应如下所示:

$points = 0;// Must be zero
$a = 3;
$b = 1;
$c = 0;
$d = 6;

我正在考虑做一个简单的解决方案,具体如下:

while($points > 0) {
    $points_taken = mt_rand(0, $points);
    $points -= $points_taken;
    $a += $points_taken;

    $points_taken = mt_rand(0, $points);
    $points -= $points_taken;
    $b += $points_taken;

    $points_taken = mt_rand(0, $points);
    $points -= $points_taken;
    $c += $points_taken;

    $points_taken = mt_rand(0, $points);
    $points -= $points_taken;
    $d += $points_taken;
}

该功能有一个问题:$ a获得更多分数(甚至所有分数)的几率更高,因为它是列表中的第一个,而$ d获得更少分数的机会更高(或者没有分数所有)因为它是列表中的最后一个。

问题:如何为所有变量提供相同的分配机会?

注意:如果其中一个变量占据了所有点数就没问题。

2 个答案:

答案 0 :(得分:2)

您可以使用随机选择范围中的一个变量,并使用变量赋值给它。

$vars = range('a','d');
while ($points) {
    $points_taken = mt_rand(0, $points);
    $points -= $points_taken;
    ${$vars[mt_rand(0, 3)]} += $points_taken;
}

答案 1 :(得分:1)

这样的东西?

    $points = 10;
    $a = 0;
    $b = 0;
    $c = 0;
    $d = 0;
    for($i=0; $i<$points; $i++) {
        $rand = rand(1,4);
        if($rand == 1) {
            $a++;
        } else if ($rand == 2) {
            $b++;
        } else if ($rand == 3) {
            $c++;
        } else if ($rand == 4) {
            $d++;
        }
    }