私はまだ php のロッキーで、2000 の 6 桁の一意の番号を生成したいと考えています。
<?php
$six_digit_random_number = mt_rand(100000, 999999);
print_r($six_digit_random_number);
?>
数字が6桁の数字であることを確認する上記の簡単なスクリプトを作成しました。今、配列として印刷された複製ではない2000個が必要ですが、どうすればよいですか?
あなたはこのように行くことができます:
$generated = array();
while (count($generated) != 2000) {
$new = mt_rand(100000, 999999);
if (!isset($generated[$new])) {
$generated[$new] = $new;
}
}
これで、$generated
配列には 2000 個の一意の乱数が含まれます。
数値が既に存在するかどうかを判断するためのルックアップを高速化するために、数値自体をインデックスとして使用して配列に数値を保存したことに注意してください。
次に、数値でインデックス付けされた単純な配列が必要な場合は、次の変換を行うことができます。
$generated = array_values($generated);
しかし、これは必要ありません。
フォローしてみてください
$randomeArray=array();
while(count($randomeArray)<2000)
{
$six_digit_random_number = mt_rand(100000, 999999);
if(!in_array($six_digit_random_number,$randomeArray))
{
$randomeArray[]=$six_digit_random_number;
}
}
print_r($randomeArray);
私は次のようにします:
<?
// Make an empty array
$numbers = array();
// Loop while there aren't enough numbers
while (count($numbers) < 2000) {
$random_number = mt_rand(100000, 999999);
if (!in_array($random_number, $numbers)) {
// This adds the number to the array
$numbers[] = $random_number;
}
}
foreach ($numbers as $number) {
echo $number."\n"; // or <br /> if you are using as part of page.
}
?>
このコードは、他の例よりもはるかに高速になります。
$nums = array();
while (count($nums) < 2000) $nums[mt_rand(100000, 999999)] = true;
番号がすでに存在するかどうかを確認する必要はありません。次に、次のようにして数値を取得できます。
foreach ($nums as $randnum => $val)
{
// Do something with the random number here.
}
in_array()はSLOWです。一致するものが見つかるまで、呼び出されるたびに配列全体を繰り返します。この場合、一致する可能性は低いため、in_array()を使用した例はO(n ^ 2)操作になります。isset()は1トン高速ですが、ここでは必要ありません。count()は、内部PHPデータ構造に格納されている配列のサイズを測定するだけなので、パフォーマンスにわずかな影響を与えるだけです。
うまくいけば、これらの役立つヒントがPHPを学ぶときに役立つでしょう。isset()のような組み込みコマンドは関数よりもはるかに高速であり、アルゴリズムのパフォーマンスを正しく理解するとともに、どの関数がどのアプローチに適しているかを理解するのに役立ちます。