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

问题描述:

向版主提问:这不是一项家庭作业。PHP:如何以相等的概率将值分配给变量?

我下面举个例子:

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

我想点随机分配到变量($ A,$ B,$ C,$ d),直到$点达到零。因此,运行某些功能/脚本后,预期随机输出应该是这样的:

$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因为它是列表中的最后一个,所以获得更少积分(或者根本没有积分)的可能性要高得多。

问题:我如何给所有变量均等的分配机会?

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

+0

一个阵列内工作,并看看http://php.net/array_rand – Calimero

+0

你需要在最后设置$点为0? – Manav

+0

@Manav不一定,但我想分发所有10分 – evilReiko

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

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

像这样的东西?

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

我喜欢你的答案。但是如果$ points是一个很大的数字,比如10000,它将不得不迭代10000次 – evilReiko

+0

啊,那就是那里 – Manav