2012-04-30 11 views
1

人にある範囲の数値を割り当てる必要があるけれども、これまで使用されていた数値は使用しないシステムを実装しています。
番号範囲と除外リストの両方が非常に大きくなることに注意してください。xとyの間の乱数xの範囲を除いて

当初、私はこのような何かをやって思ったことは最高のようになります。

<?php 
    $start = 1; 
    $end = 199999; 
    $excluded = array(4,6,7,8,9,34); 
    $found = FALSE; 
    while (!$found) { 
    $rand = mt_rand($start,$end); 
    if (!in_array($rand,$excluded)) { 
     $found = TRUE; 
    } 
    } 
?> 

しかし、私は無限ループの可能性があり、これが理想的だとは思わない(あるいは、それは非常に長い時間を取って/スクリプトをタイムアウトする)。

私は必要なすべての数字の配列を生成することも考えましたが、大規模な配列は悪くなるでしょうか?また、2つの大規模な配列の配列の差分を行うにも確かに時間がかかるだろうか?このような 何か:

<?php 
    $start = 1; 
    $end = 199999; 
    $allnums = range($start,$end); 
    $excluded = array(4,6,7,8,9,34); 
    $searcharray = array_diff($allnums,$excluded); 
    $rand = array_rand($searcharray); 
?> 

だから、私の質問は、より良い選択肢であると思われるでしょうか?そして、誰かがこれまでに使っていた、これを行う別の(より良い)方法がありますか?

答えて

2

大量のデータを保持しているアレイは大量のメモリを消費しますが、これらの数値を保持するデータベースは使用できませんか?それは一般的に彼らのために設計されたものです。

+0

それは私が考えたものです。除外された数字は、割り当てられた後にデータベースに格納されます。元の範囲もそうであると思いますが、どうすればそれを使うのでしょうか?除外されているかどうかを示すフラグを付けて番号ごとに行を格納しますか?確かにすべての数字を保存することは、彼らがすでに連続していると考えると、無駄でしょうか? – Nick

+0

'SELECT ...どこの番号ではない(4,6,7,8,9,34)ORDER BY RAND()'のようなもの? –

+0

'mt_rand'の部分はやってもかまいませんが、' in_array'ではなくデータベースで生成された番号を調べるだけです。私は数字 - プライマリキー/ミディアムイントである1つのフィールドを持つテーブルを持っています。あなたがフィールド設定権を持っていれば、この種のものに最適化された適切なデータベースがあれば、それは無駄ではありません。 – fire

関連する問題