產生一定範圍內的唯一隨機數
P粉087951442
P粉087951442 2023-10-15 20:51:55
0
2
507

我需要在一定範圍內產生隨機的唯一數字,我該怎麼做?我可以透過產生隨機數字

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;

我知道這段程式碼很糟糕,所以我需要對我的版本進行更好的最佳化程式碼! 幫忙!

範例: 如果我需要產生 1 到 15 之間的 3 個數字,它們應該類似於 5、9、1,但不是 3、1、2 [在 1 - 3 中(我想要產生的數字)]

P粉087951442
P粉087951442

全部回覆(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);

我很想知道已接受的答案與我的答案有何不同。值得注意的是,兩者的混合可能是有利的;事實上,這是一個根據某些值有條件地使用其中一個的函數:

# 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;

結果:

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

如果您使用較小的範圍和較高的返回值數量,則接受的答案肯定是最佳的;然而,正如我所預期的那樣,更大的範圍和更小的計數將需要更長的時間來接受答案,因為它必須儲存範圍內的每個可能的值。您甚至冒著超出 PHP 記憶體上限的風險。評估範圍和計數之間的比率並有條件地選擇生成器的混合體將是兩全其美的。

P粉180844619

具有隨機順序的數字範圍的陣列:

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

封裝函數:

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

範例:

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

結果:

Array
(
    [0] => 14
    [1] => 16
    [2] => 17
    [3] => 20
    [4] => 1
)
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!