PHP将int拆分为随机值

时间:2018-07-28 21:46:41

标签: php random int

我有一个名为v_cnt的int,它使用投票系统的最大值,他们使用mt_rand生成随机数的“票数”(用于游戏目的而不是操纵系统)

readLine

这使我的投票_1,投票_2和投票_3非常理想。但是,由于mt_rand是一个不超过上限的随机值,因此我无法获得所需的结果,因为我需要像这样计算;

(投票_1 +投票_2 +投票_3)= $ v_cnt

所以从本质上讲,我需要将一个int拆分为3个随机值,这些值之和必须等于起始数字。我希望这是有道理的。

谢谢。

2 个答案:

答案 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); 

https://3v4l.org/2C2bu

我也不确定您希望该行做什么:if($vote_limit < 0){ $vote_limit = 0;}
$ vote_limit不能为负,因为您有随机数的限制。


我看到您添加了一个要求具有唯一编号的请求。
我创建了一个新代码,输出的$ n_votes票全都是唯一的,没有一个是负数,都在0到$ v_cnt之间。

$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);

https://3v4l.org/2h7DB

有趣的是,如果我在代码中包含$ 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