PHP: 如何以等概率将值分配给变量?

PHP: How to distribute values to variables with equal probability?

版主注意事项:这不是家庭作业。

我有以下例子:

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

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

$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;
}

该函数有 1 个问题:$a 获得更多分数(或什至所有分数)的机会更高,因为它在列表中排在第一位,而 $d 获得更少分数(或没有)的机会更高点)因为它在列表中的最后。

问题:如何让所有变量均等分布?

注意:如果其中一个变量拿了所有的点就好了

是这样的吗?

    $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++;
        }
    }

您可以随机使用select范围内的其中一个变量,并使用可变变量分配给它。

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