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

Signaler
Messages postés
1
Date d'inscription
jeudi 26 février 2009
Statut
Membre
Dernière intervention
1 novembre 2010
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
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
A voir également:

8 réponses

Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
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+
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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 -
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
@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
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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 -
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
@Kohntark

oui

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

est inutile !
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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>

________________________________________________________
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
@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 -
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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 ]