Hasilkan nombor rawak unik dalam julat tertentu
P粉087951442
P粉087951442 2023-10-15 20:51:55
0
2
519

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粉087951442
P粉087951442

membalas semua(2)
P粉668146636
$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.

P粉180844619

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
)
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan