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因为它是列表中的最后一个,所以获得更少积分(或者根本没有积分)的可能性要高得多。
问题:我如何给所有变量均等的分配机会?
注意:如果其中一个变量占据了所有的点,那很好。
答
您可以从一个范围内随机选择一个变量,并使用变量赋值给它。
$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++;
}
}
一个阵列内工作,并看看http://php.net/array_rand – Calimero
你需要在最后设置$点为0? – Manav
@Manav不一定,但我想分发所有10分 – evilReiko