cari

Rumah  >  Soal Jawab  >  teks badan

Hasilkan nombor rawak unik dalam julat tertentu

Saya perlu menjana nombor unik rawak dalam julat tertentu, bagaimana saya boleh melakukannya? Saya boleh menjana nombor rawak dengan

generator:
$arr = [];
$x = rand($min, $max);
$len = count($arr);
$flag = 0;
for($i = 0; $i < $len; $i++)
{
 if ($flag === 1)
   goto generator;
 if ($x === $arr[$i])
   $flag = 1;
}
$arr[$index] = $x;
$index++; 
goto generator;

Saya tahu kod ini teruk, jadi saya perlu menjadikan versi saya kod dioptimumkan dengan lebih baik! tolong!

Contoh: Jika saya perlu menjana 3 nombor antara 1 dan 15, ia sepatutnya seperti 5, 9, 1, tetapi bukan 3, 1, 2 [dalam 1 - 3 (nombor yang saya ingin hasilkan)]

P粉087951442P粉087951442457 hari yang lalu563

membalas semua(2)saya akan balas

  • P粉668146636

    P粉6681466362023-10-16 18:17:22

    $len = 10;   // total number of numbers
    $min = 100;  // minimum
    $max = 999;  // maximum
    $range = []; // initialize array
    foreach (range(0, $len - 1) as $i) {
        while(in_array($num = mt_rand($min, $max), $range));
        $range[] = $num;
    }
    print_r($range);

    Saya ingin tahu bagaimana jawapan yang diterima berbeza daripada jawapan saya. Perlu diingat bahawa campuran kedua-duanya boleh memberi kelebihan; sebenarnya, berikut ialah fungsi yang menggunakan satu atau yang lain secara bersyarat berdasarkan nilai tertentu:

    # The accepted answer
    function randRange1($min, $max, $count)
    {
        $numbers = range($min, $max);
        shuffle($numbers);
        return array_slice($numbers, 0, $count);
    }
    
    # My answer
    function randRange2($min, $max, $count)
    {
        $i = 0;
        $range = array();
        while ($i++ < $count) {
            while(in_array($num = mt_rand($min, $max), $range));
            $range[] = $num;
        }
        return $range;
    }
    
    echo 'randRange1: small range, high count' . PHP_EOL;
    $time = microtime(true);
    randRange1(0, 9999, 5000);
    echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;
    
    echo 'randRange2: small range, high count' . PHP_EOL;
    $time = microtime(true);
    randRange2(0, 9999, 5000);
    echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;
    
    echo 'randRange1: high range, small count' . PHP_EOL;
    $time = microtime(true);
    randRange1(0, 999999, 6);
    echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;
    
    echo 'randRange2: high range, small count' . PHP_EOL;
    $time = microtime(true);
    randRange2(0, 999999, 6);
    echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;

    Hasil:

    randRange1: small range, high count
    0.019910097122192
    
    randRange2: small range, high count
    1.5043621063232
    
    randRange1: high range, small count
    2.4722430706024
    
    randRange2: high range, small count
    0.0001051425933837

    Jawapan yang diterima pastinya optimum jika anda menggunakan julat yang lebih kecil dan bilangan nilai pulangan yang lebih tinggi walau bagaimanapun, seperti yang saya jangkakan, julat yang lebih besar dan kiraan yang lebih kecil akan mengambil masa yang lebih lama Untuk mendapatkan jawapan yang diterima, ia perlu menyimpan setiap nilai yang mungkin dalam julat. Anda juga menghadapi risiko melebihi had memori PHP. Menilai nisbah antara julat dan kiraan dan memilih hibrid penjana secara bersyarat akan menjadi yang terbaik daripada kedua-dua dunia.

    balas
    0
  • P粉180844619

    P粉1808446192023-10-16 11:11:30

    Tatasusunan dengan julat nombor dalam susunan rawak:

    $numbers = range(1, 20);
    shuffle($numbers);

    Fungsi pembungkusan:

    function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
        $numbers = range($min, $max);
        shuffle($numbers);
        return array_slice($numbers, 0, $quantity);
    }

    Contoh:

    <?php
    print_r( UniqueRandomNumbersWithinRange(0,25,5) );
    ?>

    Hasil:

    Array
    (
        [0] => 14
        [1] => 16
        [2] => 17
        [3] => 20
        [4] => 1
    )

    balas
    0
  • Batalbalas