PHP5 : 4 nombres aleatoires et differents

Eléphanteau du PHP | 37 Messages

28 févr. 2010, 22:56

Bonjour

Connaissez vous une méthode astucieuse pour tirer 4 nombres aléatoires de 1 à 100 et tous différents ?

merci

Mammouth du PHP | 985 Messages

28 févr. 2010, 23:20

Fonction rand() ou mt_rand(), avec un intervalle différent pour les 4?
http://php.net/manual/fr/function.rand.php
http://www.php.net/manual/fr/function.mt-rand.php
Modifié en dernier par Dr@ke le 28 févr. 2010, 23:23, modifié 1 fois.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphanteau du PHP | 37 Messages

28 févr. 2010, 23:23

rand tire des nombres aléatoires mais il peut très bien tirer 4,12,4,26 , j'en cherche 4 différents

Mammouth du PHP | 985 Messages

28 févr. 2010, 23:25

Bien suffit de paramétrer des intervalles différents, ou de vérifier le résultat ensuite, et donc de relancer un rand() si nécessaire ou ajouter un chiffre...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Mammouth du PHP | 985 Messages

28 févr. 2010, 23:36

Exemple sur php.net:
<?php
$rand = array();
while (count($rand) < $total ) {
    $r = mt_rand($min,$max);
    if ( !in_array($r,$rand) ) {
        $rand[] = $r;
    }
}
?>
Ou:
<?php
 function uniqueRand($n, $min = 0, $max = null)
 {
  if($max === null)
   $max = getrandmax();
  $array = range($min, $max);
  $return = array();
  $keys = array_rand($array, $n);
  foreach($keys as $key)
   $return[] = $array[$key];
  return $return;
 }
?>
...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphanteau du PHP | 37 Messages

28 févr. 2010, 23:38

merci

ViPHP
AB
ViPHP | 5818 Messages

01 mars 2010, 02:54

A noter que l'utilisation des deux fonctions données par Dr@ke doivent être employées suivant le contexte et pas indifféremment :

La première méthode est particulièrement efficace pour retourner un petit nombre de valeurs uniques dans un intervalle assez grand.
Grosso modo on peut l'employer sans souci si le nombre de valeur à retourner est ~ inférieure à 10% de l'intervalle ex : retourner 10 valeurs uniques entre 0 et 100.

Par contre cette méthode peut devenir très lente si le nombre de valeurs à retourner s'approche de l'intervalle ex : retourner 90 valeurs uniques en 0 et 100.

Dans ce cas la seconde méthode est particulièrement appropriée. Mais cette seconde méthode possède néanmoins l'inconvénient de ne pas pouvoir être utilisée (ou sera très très lente et gourmande en ressource) sur de très gros intervalles puisque l'on crée avec la fonction range un tableau de la taille de l'intervalle. Eviter donc de dépasser 1000 éléments pour le tableau (soit par exemple un intervalle de 0 à 1000) avec cette seconde méthode.
Modifié en dernier par AB le 01 mars 2010, 17:46, modifié 1 fois.

Eléphanteau du PHP | 37 Messages

01 mars 2010, 08:07

merci pour ce complément d'informations, j'ai utilisé la 1 mais directement dans une fonction
comment fait on pour récupérer un array que retourne une fonction ?

Code : Tout sélectionner

function RandArray () { $unArray[] = ..... ...... return $unArray; }
si je veux l'utiliser dans une autre fonction ?

Code : Tout sélectionner

function useArray () { $var = RandArray[2] ; return $var; }
ce dernier code ne marche pas

merci

ViPHP
ViPHP | 2287 Messages

01 mars 2010, 16:38

Pour accéder à des éléments du tableau ( [...] ) , il faut passer par une variable :
$tableau = MaFonctionQuiRetourneUnTableau($param1,$param2);
echo $tableau['cle'];
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphanteau du PHP | 37 Messages

01 mars 2010, 16:46

ok il faut affecter le tableau à une variable qui devient le tableau

merci

ViPHP
AB
ViPHP | 5818 Messages

01 mars 2010, 18:53

Tu pourrais aussi déclarer ton tableau "global", mais ce n'est pas recommandé tant qu'on peut faire facilement autrement.

Eléphanteau du PHP | 37 Messages

01 mars 2010, 18:57

oui je vais me simplifier la vie quoique j'aime bien ces déclarations plus explicites venant de .net

merci