Génerateur de nombre aléatoire [Résolu]

Messages postés
1
Date d'inscription
jeudi 26 février 2009
Dernière intervention
1 novembre 2010
- - Dernière réponse : cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 7 nov. 2010 à 10:58
Bonjour à tous,
j'ai un problème je ne sais comment écrire un programme en php qui génère des nombres aléatoire constitué de 6 chiffres sans repetition.
merci pour votre bonne comprehension
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Dernière intervention
11 septembre 2013
3
Merci
salut


<?php

$haz=array(1,
rand(2,3),
rand(4,5),
rand(6,7),
rand(8,9),0);

shuffle($haz);

$co="";
$i=0;

while($i<6){
$co.= $haz[$i];
  if(!in_array($co,$haz)){
  }else{}
$i++;
}

echo $co;

?>



c'est pour image captcha ?

a+

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cod57
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
0
Merci
Salut,

Ca me semble bien lourd tout ça !

Un truc comme ça est plus simple, non ?
$aNb = array_rand(range(0, 9), 6);
echo implode($aNb);


Bon, j'imagine que l'aléatoire n'a qu'un intérêt hyper limité ici (dans le cas contraire on ne met pas en place ce genre de limitation et on utilise des caractères, min/maj, etc ...) mais il est à noter que cette solution est moins aléatoire que celle que tu proposais.

Sur 100 itérations, il peut y avoir jusqu'à 4 fois le même chiffre, contre 2 avec la tienne.
Sur 1000, 12 contre 2.
Sur 100000, 550 contre 25

Ce ne sont que des valeurs issues de tests rapides, histoire de se faire une idée.

Menfin l'aléatoire on s'en fout un peu dans le cas présent ^^

Je n'ai pas compris ça :
while($i<6){
$co.= $haz[$i];
  if(!in_array($co,$haz)){
  }else{}
$i++;
}


Pourquoi pas :
$co = implode($haz);

?

Cordialement,

Kohntark -
Commenter la réponse de kohntark
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Dernière intervention
11 septembre 2013
0
Merci
@Kohntark

je vient de découvrir l'existence de array_rand() !
Ne prend pas mon exemple à coeur (c'est de la bricole)
il marche c'est tout, je pense que samnick voulait seulement la non répétition

le while : en fait je verifie si un élément
avec indice $i du tableau $haz existe déjà sinon je saute
à une nouvelle itération jusqu'à avoir 6 indices
avec un contenu différent

Merci pour ton exemple
Commenter la réponse de cod57
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
0
Merci
Ne prend pas mon exemple à coeur (c'est de la bricole)
il marche c'est tout, je pense que samnick voulait seulement la non répétition

Je ne le prends pas plus à coeur que ça
Mais plus c'est simple mieux c'est, non ?

le while : en fait je verifie si un élément
avec indice $i du tableau $haz existe déjà sinon je saute
à une nouvelle itération jusqu'à avoir 6 indices
avec un contenu différent

Heu, non, là tu ne fais rien d'autre que concaténer les valeurs d'un tableau ($haz) dans une chaîne ($co), ce qui revient au même qu'un implode(), mais en moins propre et moins efficace.
Tes lignes :
if(!in_array($co,$haz)){
  }else{}

ne servent à rien.

Bonne soirée,


Kohntark -
Commenter la réponse de kohntark
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Dernière intervention
11 septembre 2013
0
Merci
@Kohntark

oui

if(!in_array($co,$haz)){
}else{}

est inutile !
Commenter la réponse de cod57
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
unicRandomizer class php
<?php
/* unicRandomizer

  construction $=new unicRandomizer(min, max, resetLimit)
    parameters :
      min   : int, def 0, minimal random interval
      max   : int, def 100, maximal random interval
      resetLimit : int, def 1000, cached values limit 
       
  reset()
    reset cache
    no parameters, returns the number of suppressed values
    
  setMin(min,reset)
    set minimal value of random interval
    parameters :
      min   : int, def 0
      reset : bool, def true
    return :
      0 setting ok, 1 setting corrected and ok, -1 error
      
  setMax(max,reset)
    set maximal value of random interval
    parameters :
      max   : int, def 0
      reset : bool, def true
    return :
      0 setting ok, 1 setting corrected and ok, -1 error

  setMinMax(min,max,reset)
    set minimal and maximal values of random interval
    parameters :
      min   : int, def 0
      max   : int, def 100
      reset : bool, def true
    return :
      array("min","max") values : 0 setting ok, 1 setting corrected and ok, -1 error

  rand() 
    generate unique random value
    no parameters, return random value in min>=value<=max interval  
*/
class unicRandomizer{
  protected $cache=array();
  protected $resetLimit=1000;
  protected $min=0;
  protected $max=100;
  public function __construct($min=0,$max=100,$resetLimit=1000){
    $this->cache=array();
    $this->resetLimit=$resetLimit;
    $this->min=$min;
    $this->max=$max;
    rand(0,100);
  }
  public function reset(){
    $ret=count($this->cache);
    $this->cache=array();
    return $ret;
  }
  public function setMin($min=0,$reset=true){
    if($min > $this->max){
      $this->min=$this->max;
      $this->max=$min;
      if($reset)$this->reset();
      return 1;
    } else {
      $this->min=$min;
      if($reset)$this->reset();
      return 0;
    }
    return -1;
  }
  public function setMax($max=100,$reset=true){
    if($max < $this->min){
      $this->max=$this->min;
      $this->min=$max;
      if($reset)$this->reset();
      return 1;
    } else {
      $this->max=$max;
      if($reset)$this->reset();
      return 0;
    }
    return -1;
  }
  public function setMinMax($min=0,$max=100,$reset=true){
    $ret=array(
      "min"=>$this->setMin($min,false),
      "max"=>$this->setMax($max,$reset)
    );
    return $ret;
  }
  public function rand(){
    $ret=rand($this->min, $this->max);
    while(in_array($ret, $this->cache)){
      $ret=rand($this->min, $this->max);
    }
    array_push($this->cache,$ret);
    if(count($this->cache) >= $this->resetLimit){
      $this->reset();
    }
    return $ret;
  }
}
?>



unicRandomizer demo php
<?php
include_once("unicRandomizer.class.php");
$ur=new unicRandomizer(100000,999999);
?>
<html>
<head>
</head>

<?php
for($i=0;$i<100;$i++){
  echo $ur->rand(),'
';
}
?>

</html>

________________________________________________________
Commenter la réponse de f0xi
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
0
Merci
@Foxi :
Je n'ai que parcouru, mais :
Je ne vois pas en quoi cette classe réponds à la question :
"générer un nombre aléatoire constitué de 6 chiffres sans répétition"
L'objet c'est bien, mais dans ce cas, heu ... ça n'apporte rien.


Kohntark -
Commenter la réponse de kohntark
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
Bonjour,

Pour une question PHP, merci de poster sur phpcs.com dans un thème PHP et non dans le bar.

[ Déplacé sur phpcs ]
Commenter la réponse de cs_rt15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.