2013-08-29 1 views
0

Приведенный ниже код не производит 3 случайных не повторяющихся чисел из 15.PHP: Случайные числа, не дублировать, не предыдущий и следующий номер

function num($min, $max, $count){ 
    $count = abs((int)$count); 
    if($min > $max){ 
     list($min, $max) = array($max, $min); 
    } 
    $u = abs($max - $min); 
    if($count > $u)$count = $u; 
    $numresult = range($min, $max); 
    shuffle($numresult); 
    return array_slice($numresult, 0, $count); 
} 
foreach(num(1, 15, 3) as $rnum){ 
    echo $rnum, ' '; 
} 

Есть ли способ также исключить предыдущий и следующий номер, когда происходит случайный выбор? Например: если первое выбранное число равно 7, то 6, 7 и 8 следует исключить для следующих двух выборов. В настоящее время исключено только 7.

ответ

3

Вы собираетесь должны применить немного больше сообразительности:

function getNumbers($min=1,$max=10,$count=1,$margin=0) { 
    $range = range(0,$max-$min); 
    $return = array(); 
    for($i=0; $i<$count; $i++) { 
     if(!$range) { 
      trigger_error("Not enough numbers to pick from!",E_USER_WARNING); 
      return $return; 
     } 
     $next = rand(0,count($range)-1); 
     $return[] = $range[$next]+$min; 
     array_splice($range,max(0,$next-$margin),$margin*2+1); 
    } 
    return $return; 
} 

Для вызова:

echo implode(", ",getNumbers(1,15,3,1)); 
+0

Alright это потрясающе! И это работает из коробки. Большое спасибо! –

+0

Как правило, для обеспечения его работы вы должны иметь свои аргументы, такие как '$ max- $ min> ($ margin * 2 + 1) * $ count'. Это гарантирует, что, независимо от результата, он сможет дать вам результат каждый раз. В этом конкретном случае '14> 9', так что все в порядке. –

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