我有一个名为v_cnt的int,它使用投票系统的最大值,他们使用mt_rand生成随机数的“票数”(用于游戏目的而不是操纵系统)
readLine
这使我的投票_1,投票_2和投票_3非常理想。但是,由于mt_rand是一个不超过上限的随机值,因此我无法获得所需的结果,因为我需要像这样计算;
(投票_1 +投票_2 +投票_3)= $ v_cnt
所以从本质上讲,我需要将一个int拆分为3个随机值,这些值之和必须等于起始数字。我希望这是有道理的。
谢谢。
答案 0 :(得分:1)
您不能同时拥有全部三个。不可能
前两个,当然。但是最后一个只能是一个数字,剩下的就是这个数字。
// vote 1
$vote_limit = $v_cnt;
$vote_1 = mt_rand(0, $vote_limit);
// vote 2
$vote_limit = $v_cnt - $vote_1;
$vote_2 = mt_rand(0, $vote_limit);
// vote 3
$vote_3 = $v_cnt - ($vote_1 + $vote_2);
我也不确定您希望该行做什么:if($vote_limit < 0){ $vote_limit = 0;}
。
$ vote_limit不能为负,因为您有随机数的限制。
$v_cnt = 100;
$n_votes = 3;
$numbers = range(0,$v_cnt); // create array of 0->100
shuffle($numbers); // shuffle the array
$votes = array_fill(0, $n_votes-1, 1); // create an array that will NOT exit loop below.
// Array_fill returns [1,1,1] which does not match the requirements so the loop starts
//Loop until all values in votes are unique and none is negative
while(count(array_unique($votes)) != $n_votes || $votes[$n_votes-1]<1){
// Take two consecutive numbers of random place in the array
$votes = array_slice($numbers, mt_rand(0, $v_cnt-$n_votes+1),$n_votes-1);
// Count what the last item should be
$votes[] = $v_cnt - array_sum($votes);
}
echo array_sum($votes) . "\n";
Var_dump($votes);
有趣的是,如果我在代码中包含$ i,我们可以看到在循环中需要多少次尝试才能创建唯一数组。 https://3v4l.org/mPae5
请记住,此代码对于与投票数相对应的最高限额非常敏感。
如果$ v_cnt相对较低而$ n_votes较高,则可能永远找不到所需的数字。
只需尝试在最新链接中将$ n_votes设置为5,您就会看到$ i数字可以是100+(这意味着需要100个以上的循环才能获得正确的数字集)。
答案 1 :(得分:0)
这就是我的处理方式...
$vote_limit = $v_cnt;
$numbers_required = 3;
for($i=1;$i<=$numbers_required;$i++)
{
if($i != $numbers_required)
{
$votes[$i] = mt_rand(0, $vote_limit);
$vote_limit -= $votes[$i];
} else {
$votes[$numbers_required] = $v_cnt - array_sum($votes);
}
}
echo $votes[1]; // First
echo $votes[2]; // Second
echo $votes[3]; // Third