PHP将int拆分为随机值

PHP将int拆分为随机值,php,random,int,Php,Random,Int,我有一个名为v_cnt的int,它使用投票系统的最大值,它们使用mt_rand生成随机数目的“投票”(用于游戏目的,而不是被操纵的系统) //投票1 $vote_limit=$v_cnt; $vote\u 1=百万兰特(0,$vote\u限制); //第2票 $vote_limit=$v_cnt-$vote_1;如果($vote_limit

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

//投票1
$vote_limit=$v_cnt;
$vote\u 1=百万兰特(0,$vote\u限制);
//第2票
$vote_limit=$v_cnt-$vote_1;如果($vote_limit<0){$vote_limit=0;}
$vote_2=百万兰特(0,$vote_限制);
//第3票
$vote_limit=$v_cnt-($vote_1+$vote_2);如果($vote_limit<0){$vote_limit=0;}
$vote_3=百万兰特(0,$vote_限制);
这给了我一票、二票和三票,这是最理想的。但是,由于mt_rand是一个随机值,达到了极限,我没有得到我需要的结果,因为我需要它来这样计算

(投票1+投票2+投票3)=$v\u cnt

所以本质上我需要把一个int分成3个随机值,加起来等于起始值。我希望这是有道理的


多谢各位

你不可能三个都是随机的。这是不可能的。
前两个,当然。但最后一个数字只能是一个数字,这就是剩余的数字

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

另外,我不确定您希望这一行做什么:
如果($vote\u limit<0){$vote\u limit=0;}

$vote_limit不能为负数,因为您有一个随机数的限制


我看到您添加了一个请求,要求拥有唯一的号码。
我创建了一个新代码,它输出的$n_选票都是唯一的,没有一个是负的,并且都在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);
$v_cnt=100;
$n_票数=3;
$numbers=范围(0,$v_cnt);//创建0->100的数组
洗牌($number);//洗牌
$voces=array_fill(0,$n_voces-1,1);//创建一个不会退出下面循环的数组。
//数组_fill返回的[1,1,1]与要求不匹配,因此循环开始
//循环,直到投票中的所有值都是唯一的,并且没有一个值是负数

而(count(count(array_unique($voces))!=$n_voces | |$$voces[$n_voces-1]我将如何处理这个问题

$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
$vote\u limit=$v\u cnt;
$numbers\u required=3;

对于($i=1;$iI喜欢这种改进的方法,但是你能给我解释一下这句话吗?$v_cnt=$vote_limit=100;对不起,那是我刚刚为你测试的时候。我已经更新了我的答案,删除了它。没问题,你知道一种让每个数字不同的方法吗,我总是需要多数票或获胜票,所以举例来说,我不可能有20、20、10票e as 21、20、9就可以了。嗯,这增加了一点复杂性,但可能在第一次调用
mt_rand($min,$max)
时,将
$min
设置为
ceil($vote_limit/2)
诸如此类……祝你玩得开心!你应该包括一些注释或描述你的代码与OPs的不同之处。仅仅转储代码并不是回答问题的合适方式。谢谢,不敢相信我只是直接看了一下。作为对你编辑的回应,再看一遍,你是对的,我非常小心地尝试使用catch值会引起问题,通过快速检查,我已经这样做了几次。感谢您花时间提供帮助,我感谢您的努力。我将很快运行您的代码并返回给您。因此,经过一些测试后,它完全符合我的需要。谢谢您。没有问题!我再说一次,我说得还不够,在一个小范围内不需要太多投票数字的e。
$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