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

PHP:如何以相等的概率将值分配给变量?,php,math,probability-distribution,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) { $poi

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

我举了以下例子:

$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获得更少点数(或根本没有点数)的几率要高得多,因为它是列表中的最后一个

问题:如何让所有变量都有均等的分布机会

注意:如果其中一个变量占据了所有的点,那就好了。

类似的情况

    $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++;
        }
    }
$points=10;
$a=0;
$b=0;
$c=0;
$d=0;

对于($i=0;$i),您可以使用从范围中随机选择一个变量,并使用变量分配给它

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

在一个数组中工作,看看你是否需要在最后将$points设置为0?@Manav不一定,但我想分配所有10个点。我喜欢你的答案。但是如果$points是一个大数字,比如10000,它必须迭代10000次啊,就是这样