2013-08-29 2 views
0

Le code ci-dessous produit 3 aléatoires aucun numéro de répétition sur 15.PHP: nombres aléatoires, aucun double, aucun précédent numéro suivant et

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, ' '; 
} 

Est-il possible d'exclure aussi le précédent et le numéro suivant lorsque un choix aléatoire se produit? Par exemple: Si le premier nombre sélectionné est 7, alors 6, 7 et 8 doivent être exclus pour les deux choix suivants. Actuellement, seulement 7 est exclu.

Répondre

3

Vous allez devoir appliquer un peu plus d'esprit:

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

Pour appeler:

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

Bon c'est génial! Et cela fonctionne hors de la boîte. Merci beaucoup! –

+0

En règle générale, pour vous assurer que cela fonctionne, vous devriez avoir vos arguments tels que '$ max- $ min> ($ margin * 2 + 1) * $ count'. Cela garantira que, quel que soit le résultat, il sera en mesure de vous donner un résultat à chaque fois. Dans ce cas particulier, '14> 9' vous allez bien. –