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;
}
版主注意事项:这不是家庭作业。
我有以下例子:
$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;
}