首先,我为我缺乏英语而道歉。我希望你能理解我在这里要解释的内容。
所以基本上我需要构建一个限制数组内重复值数量的函数。
我需要这样做的原因是我建立了一个将数字分成组的系统,每个组都必须具有相同数量的数字。
编辑:随机数代表组号。
我已经编写了一个函数来执行此操作但由于某种原因,它无法正常工作。
function jagaTiimid($max, $liiget, $tArvLength, $tArv){
$tiimid = []; //Starting array
for($z=0;$z<$liiget;$z++){
$numbers = [];
$rn = randomNumber($tArvLength, $tArv, $numbers); //Generate a random number for a group, etc group 1, group 2, group 3
$mitu = countInArray($tiimid, $rn); //Check how many times that number has occured in array
if($mitu == $max){ //If it equals to maximum number of times then...
$rnUus = randomNumber($tArvLength, $tArv, $numbers); //generate a new random number
while($rnUus == $rn){
$numbers = [];
$rnUus = randomNumber($tArvLength, $tArv, $numbers);
} //loop until the new generated number doesn't equal to old rn.
$tiimid[] = $rnUus; //if it doesn't equal to $rn then push into array
}else{
$tiimid[] = $rn;
}
}
return $tiimid;
}
由于某种原因,这个数字仍然比预想的要多。
基本上它不应该结束的是。
正如您所看到的,一组(组2)发生的次数多于其他组,但两组之间应该相同。
编辑:CountInArray();
function countInArray($array, $what) {
$count = 0;
for ($i = 0; $i < count($array); $i++) {
if ($array[$i] === $what) {
$count++;
}
}
return $count;
}
答案 0 :(得分:1)
当第一个随机选择击中已经使用$liiget
次的数字时,内部循环开始,但它不检查新生成的随机数是否已经$liiget
次。
为了提高效率,我会跟踪一个号码的使用次数。此外,如果确实没有任何数字不会超过最大重现次数,您可以从安全网中受益。
没有必要使用嵌套循环。代码如下所示:
function jagaTiimid($max, $liiget, $tArvLength, $tArv){
$tiimid = []; //Starting array
$counts = []; // Helper for quick count
$tries = 0; // Counter to avoid infinite looping
while (count($tiimid) < $liiget && $tries++ < 100) {
$numbers = [];
$rn = randomNumber($tArvLength, $tArv, $numbers); //Generate a random number for a group, etc group 1, group 2, group 3
if (!isset($counts[$rn])) $counts[$rn] = 0; // initialise on first occurence
if ($counts[$rn] < $max) {
$tiimid[] = $rn; // add it to the result
$counts[$rn]++; // ... and adjust the count
$tries = 0; // reset the safety
}
}
return $tiimid;
}
答案 1 :(得分:0)
用while替换while($ rnUus == $ rn)(countInArray($ tiimid,$ rnUus)&gt; = $ max) - 伊利亚·布尔索夫