Самый быстрый способ получить 10 случайных чисел из диапазона

1

Я хочу получить 10 случайных чисел из заданного диапазона.

Я использую ниже код, но для большего диапазона он медленный. Любой альтернативный способ сделать это как можно быстрее.

$rangearr = array_rand(range(1,11892032), 5);
$rangearr  = implode(",",$rangearr);
Теги:

5 ответов

6
Лучший ответ

просто используйте mt_rand()

$randomnr = array();
$min = 1;
$max = 11892032;
for($i = 0; $i < 10;$i++) {
    $randomnr[] = mt_rand($min, $max);
}
echo implode(', ', $randomnr);

Для уникальных номеров используйте это:

$randomnr = array();
$min = 1;
$max = 11892032;
$i = 1;
while($i <= 10) {
    $rand = mt_rand($min, $max);
    if(!in_array($rand,$randomnr)) {
        $randomnr[] = $rand
        $i++;
    }
}

Загрузите значения 11892032 в массив, найдите время, чтобы вы просто сгенерировали 10 чисел.

  • 1
    это будет уникальным?
  • 0
    @ Вишну Нет, ты должен это проверить.
Показать ещё 7 комментариев
1

Поэтому я бросил это вместе

<?php

// range
$timer = microtime(true);

$rangearr = array_rand(range(1,11892032), 5);
$rangearr  = implode(",",$rangearr);

echo number_format(microtime(true) - $timer, 5) . '<br>';

// fixed range
$timer = microtime(true);

$range = range(1, 11892032);
$rangearr = array_rand($range, 5);
$rangearr  = implode(",",$rangearr);

echo number_format(microtime(true) - $timer, 5) . '<br>';

// for loop
$timer = microtime(true);

$rangearr = [];
for($i = 0; $i < 5; $i++)
{
    $rangarr[] = rand(1, 11892032);
}

echo number_format(microtime(true) - $timer, 5) . '<br>';

Я получаю эти результаты

1.93242
1.18987
0.00002

Я бы пошел с петлей!

1

Если вам нужен однострочный:

$min = 1;
$max=11892032;
echo implode(',', array_map(function()use($min,$max){return mt_rand($min, $max);},range(0,9)));
  • 1
    Если все понимают однострочность, как и вы, все в PHP можно сделать одной строкой.
  • 1
    и я вижу три строки, мне это нравится, хотя
Показать ещё 2 комментария
0

Вы также можете попробовать этот фрагмент ниже, он быстрее, чем range() и вы предоставите почти безопасное целое число или в этом случае float без десятичных знаков, вы также можете отправить его в int перед возвратом.

Я также проверял дуплеки в цикле, поэтому, если вы хотите пять уникальных чисел ($randomNumberCount = 5;), вы получите его.

ОСТОРОЖНО: если возникает ошибка, прочитайте комментарии в моем коде.

Рабочий пример:

function secure_rand( $min, $max ) {
    $diff = $max - $min;
    if ($diff < 0 || $diff > 0x7FFFFFFF) {
        throw new RuntimeException("Bad range");
    }

    // if mcrypt is enabled try this
    //$bytes = mcrypt_create_iv( 4, MCRYPT_DEV_URANDOM );

    // if mcrypt is not enabled on your server, you can use this
    $bytes = openssl_random_pseudo_bytes( 4 );

    // if mbstring is not enabled, you can also use iconv_strlen
    if ($bytes === false || mb_strlen($bytes, '8bit') != 4) {
        throw new RuntimeException("Unable to get 4 bytes");
    }

    $ary = unpack("Nint", $bytes);
    $val = $ary['int'] & 0x7FFFFFFF;   // 32-bit safe
    $fp = $val / 2147483647.0; // convert to [0,1]
    // if you really need a type of int take this
    // return (int) round($fp * $diff) + $min;
    // otherwise it will return a float without decimal numbers
    return round($fp * $diff) + $min;
}


$randomNumbers = array();
$randomNumberCount = 5;
$min = 1;
$max = 11892032;

while( count( $randomNumbers ) < $randomNumberCount ) {
    $rand = secure_rand( $min, $max );
    // check for doublettes
    if( in_array( $rand, $randomNumbers ) ) continue;

    $randomNumbers[] = $rand;
}

$randomNumbers = implode( ",", $randomNumbers );

echo $randomNumbers;
0

Другой путь

$arr = array();
$min = 1;
$max = 11892032 + 1; // important +1
for ($i = 0; $i < 10; $i++) {
    $arr[] = (mt_rand() + $min) % $max;
}

Чтобы прочитать перед сном: http://pageconfig.com/post/faster-random-numbers-with-php

Ещё вопросы

Сообщество Overcoder
Наверх
Меню