2017-07-03 16 views
-1

まず、私の英語の欠如についてお詫び申し上げます。ここで説明しようとしていることを理解してくれることを願っています。配列内の重複する値を制限する方法

基本的には、配列内の重複値の数を制限する関数を構築する必要があります。

私はこれを行う必要がある理由は、数字をグループに分けるシステムを構築しており、すべてのグループが同じ数の数字を持たなければならないということです。

EDIT:乱数はグループ番号を表します。

私は関数を作成しましたが、何らかの理由で正しく機能しません。

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)は、他のグループよりも多く回発生するが、それは両方のグループのために等しくなければなりません。

EDIT:CountInArray();

function countInArray($array, $what) { 
    $count = 0; 
    for ($i = 0; $i < count($array); $i++) { 
     if ($array[$i] === $what) { 
      $count++; 
     } 
    } 
    return $count; 
} 
+1

「英語の不足」とは何ですか? – arkascha

+0

@arkascha私はネイティブスピーカーではないと思っていたので、あなたの人達/ギャルは私が説明していることを理解していないかもしれません。 – drpzxc

+0

'while($ rnUus == $ rn)'を 'while(countInArray($ tiimid、$ rnUus)> = $ max)に置き換えてください。 ' –

答えて

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;  
} 
+0

実際に働いてくれてありがとう、@トリコット。 – drpzxc

0

しばらく(countInArray($ tiimid、$ rnUus)> = $最大)と($ rnUus == $のRN) をしばらく置き換える - イリヤBursov

関連する問題