2015-10-06 1 views
0

Я хочу создать 8 случайных чисел, которые являются уникальными и в диапазоне от 0 до 99.PHP: Несколько Уникальные Случайные Целые в определенном диапазоне

Есть аккуратнее решение, чем тот, что я думал о ?

<?php 


do { 

    $rnd1 = rand(0,99); 
    $rnd2 = rand(0,99); 
    $rnd3 = rand(0,99); 
    $rnd4 = rand(0,99); 
    $rnd5 = rand(0,99); 
    $rnd6 = rand(0,99); 

} while (($rnd1 == $rnd2) || 
     ($rnd1 == $rnd3) || 
     ($rnd1 == $rnd4) || 
     ($rnd1 == $rnd5) || 
     ($rnd1 == $rnd6) || 
     ($rnd2 == $rnd3) || 
     ($rnd2 == $rnd4) || 
     ($rnd2 == $rnd5) || 
     ($rnd2 == $rnd6) || 
     ($rnd3 == $rnd4) || 
     ($rnd3 == $rnd5) || 
     ($rnd3 == $rnd6) || 
     ($rnd4 == $rnd5) || 
     ($rnd4 == $rnd6) || 
     ($rnd5 == $rnd6) ); 


?> 
+0

'$ Диапазон = диапазон (0, 99); перетасовка ($ диапазон); $ rand_ints = array_slice ($ range, 0, 8); ' – Phylogenesis

ответ

2

Попробуйте выполнить приведенный ниже код.
Он будет создавать массив, содержащий 8 случайных значений от 0 до 99, при проверке, были ли они уже добавлены для обеспечения их уникальности.

$numbers = array(); 
while (count($numbers) <= 8) { 
    $x = mt_rand(0,99); 
    if (!in_array($x,$numbers)) { 
     $numbers[] = $x; 
    } 
} 
print_r($numbers); 

см Кроме того, эти два Q & элементов а об использовании mt_rand vs. rand
Difference between mt_rand() and rand()
What's the disadvantage of mt_rand?

+1

Также обратите внимание, что у нас есть [' random_int'] (http://php.net/manual/en/function.random-int.php) – PeeHaa

+0

good point @ PeeHaa, хотя это будет доступно в PHP 7 –

+1

Мое решение быстрее, чем проверка с помощью 'in_array' каждый раз, когда вы генерируете число. –

-1
$rnds = []; 

do { 
    $newRnd = rand(0, 99); 
    $rnds[] = $newRnd; 
} while(in_array($newRnd, $rnds) && count($rnds) < 9); 

print_r($rnds); 
+0

Если есть дубликат, это приведет только к другой итерации цикла (do while), а не удалить или перезаписать его. Убейте 'rand' с' 5', и вы увидите, что я прав. –

1

Это оптимизированная версия, которая опирается на индексы массива. Сложность этого решения линейна, а не n как в ответе @ AlexAndrei. Он полагается на использование индексов массивов в качестве гарантии отсутствия дубликатов, поэтому нет необходимости добавлять накладные расходы in_array.

$random_numbers = []; 

do { 
    $rand = rand(0, 99); 
    $random_numbers[$rand] = $rand; 
} while(count($random_numbers) < 9); 

$random_numbers = array_values($random_numbers); // This strips the keys 

print_r($random_numbers); 

Если вы используете foreach вы можете даже бросить array_values вызов, который также увеличивает скорость вашего кода, но числа в массиве будет в виде: [ a => a, b => b, ... ]

+0

Хотя вы можете использовать 'mt_rand()' вместо 'rand()', который должен теоретически ускорить процесс генерации авария из-за более высокой энтропии 'mt_rand()'. –

Смежные вопросы