Heim  >  Fragen und Antworten  >  Hauptteil

Generieren Sie einzigartige Zufallszahlen innerhalb eines bestimmten Bereichs

Ich muss zufällige, eindeutige Zahlen innerhalb eines bestimmten Bereichs generieren. Wie kann ich das tun? Ich kann Zufallszahlen generieren mit

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;

Ich weiß, dass dieser Code schrecklich ist, deshalb muss ich meine Version besser optimieren! helfen!

Beispiel: Wenn ich 3 Zahlen zwischen 1 und 15 generieren muss, sollten sie wie 5, 9, 1 sein, aber nicht 3, 1, 2 [in 1 - 3 (die Zahlen, die ich generieren möchte)]

P粉087951442P粉087951442394 Tage vor511

Antworte allen(2)Ich werde antworten

  • 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);

    我很想知道已接受的答案与我的答案有何不同。值得注意的是,两者的混合可能是有利的;事实上,这是一个根据某些值有条件地使用其中一个的函数:

    # 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 内存上限的风险。评估范围和计数之间的比率并有条件地选择生成器的混合体将是两全其美的。

    Antwort
    0
  • P粉180844619

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

    具有随机顺序的数字范围的数组:

    $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
    )

    Antwort
    0
  • StornierenAntwort