0

AA0000-ZZ9999 の範囲ですべての可能な組み合わせを生成するように求められました (これを と呼びましょうfolio)。組み合わせごとに、8 桁の一意の ramdom 番号 (と呼びましょうattcode) も必要です。連続することはできません。多くの組み合わせがあり、プロセスは遅くなりますが、rand関数を使用していて、すべてが一意でなければならないことを検証するattcode必要があるため、コードが遅くなっているので、可能であれば (私はそれを知っています)方法がわかりません)、コードでこれを改善するにはどうすればよいかについての推奨事項を教えてください

$alph = str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 1);
$code_cache = array();
foreach ($alph as $value1) {
  foreach ($alph as $value2) {
    for ($i = 0; $i <= 9; $i++) {
        $n=$i;
        if($i<10){
            $n="000".$i;
        }
        elseif($i<100){
            $n="00".$i;
        }
        elseif($i<1000){
            $n="0".$i;
        }
        $code = rand(10000000, 99999999);
        while(in_array($code, $code_cache)){
            $code = rand(10000000, 99999999);
        }
        $code_cache[]=$code;
        echo $value1.$value2.$n.'-'.$code.'<br/>';
    }
  }
}
4

2 に答える 2

2

OK、今回は完全にクラックしました。私は実際にこれについて少し満足しています:

// An array of 10000 0's
$attcodes1 = array_fill(0, 9999, 0);

// An array of 10000 from 0 - 9999
$attcodes2 = range(0, 9999);
// Not actually necessary but makes $attcodes appear more random
shuffle($attcodes2);

// Loop until the alphas roll over to 3 characters
for ($alpha = "AA", $num = 0; $alpha != 'AAA'; $num++) {
  if ($num == 1001) {
    $num = 0; // At 1000 reset the counter to 0
    $alpha++; // Roll over to next alpha sequence
  }
  $folio = sprintf("$alpha%04s", $num); // Generate folio

  // Here's the clever bit, if I do say so myself...
  // Loop while we are hitting 4 digit sequences that have used every other
  // possible 4 digit sequence and remove them from the options.
  // This is *very* unlikely to loop more than twice, if ever
  while ($attcodes1[$part1 = array_rand($attcodes1)] >= 9999) {
    array_splice($attcodes1, $part1, 1);
  }
  // Get a 4 digit sequence not used with $part1 before and make sure we never
  // get it again (increment counter)
  $part2 = $attcodes2[$attcodes1[$part1]++];
  // Now it just needs stitching together and left-padding with 0s
  $attcode = sprintf("%04s%04s", $part1, $part2);

  // Job done
  echo $folio.'-'.$attcode."\n";

}

...そして、私の初期の試みが生成していた非常識なメモリ使用量なしで。真剣に、PHP で32 ビット ( 4 バイト! ) の整数を格納するには24 バイトが必要です。

私の (かなり低スペックの) ラップトップでの進行状況を見て、最初から最後まで 10 分の実行時間を見積もっています。その場で結果をエコーし​​なければ、これはかなり減少します。おもう。メモリを使い果たしたり、ディスク I/O で動けなくなったりすることなく、代わりにそれらをどうするかはわかりませんが。

于 2012-08-03T21:19:27.307 に答える
0

機能を 1 つ作成しました。実行してください

function fnGetRandomNumber($intLength = 6) 
{
  $arrAlphNumeric = array("c","d"); 
  $arrCharacters = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"); 
  $arrNumbers = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 
  $strNewNumber = ""; 
  $intCountNumberLength = 1; 
  do { 
     $strValue = $arrAlphNumeric[rand(0,1)]; 
     if($strValue == "c") { 
        $strNewNumber .= $arrCharacters[rand(0,25)]; 
      } else { 
        $strNewNumber .= $arrNumbers[rand(0,9)]; 
      } 
        $intCountPasswordLength++; 
    } while($intNumberLength >= $intCountNumberLength); 

    return $strNewNumber; 
} 
于 2012-12-28T17:57:57.837 に答える