主持人注意:这不是家庭作业。
我有以下示例:
$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获得更少分数的机会更高(或者没有分数所有)因为它是列表中的最后一个。
问题:如何为所有变量提供相同的分配机会?
注意:如果其中一个变量占据了所有点数就没问题。
答案 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++;
}
}