Fonction aléatoire sur tableaux

asdr Messages postés 9 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 21 juin 2011 - 21 juin 2011 à 15:53
asdr Messages postés 9 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 21 juin 2011 - 21 juin 2011 à 17:39
Bonjour,

Je travail en ce moment sur une fonction permettant de choisir 2 nombres aléatoirement dans un tableau de valeurs définies, sachant que le deuxième nombre doit être différent du premier et qu'il ne doit jamais avoir été tiré en même temps que le premier (pour cela je parcours un deuxième tableau de valeurs).

Je suis dessus depuis plusieurs jours et je dois avouer que je bloque ... surtout sur la logique.

Voici mon code simplifié :

<?php
$tableau_valeurs array(24> 32, 32 => 24.39);
$tableau_valeurs_2 array(1> 24, 2 => 32, 3 =>39);
$nombres_elements = 3;
$i = 0;

$chiffre_aleatoire_1 = array_rand ($tableau_valeurs_2, 1);
$chiffre_aleatoire_2 = array_rand ($tableau_valeurs_2, 1);

if (isset($tableau_valeurs[$tableau_valeurs_2[$chiffre_aleatoire_1]])){
$tableau_valeurs_separes = explode ('.', $tableau_valeurs[$tableau_valeurs_2[$chiffre_aleatoire_1]]);
$nombre_valeurs_separes = count ($tableau_valeurs_separes);
while (($i 0)||($chiffre_aleatoire_2 $chiffre_aleatoire_1)){
for ($j = 0; $j <= $nombre_valeurs_separes; $j++){
if ($tableau_valeurs_2[$chiffre_aleatoire_2] == $tableau_valeurs_separes[$j]){
break;
}
if (($j == $nombre_valeurs_separes)&&($chiffre_aleatoire_2 != $tableau_valeurs_separes[$j])){
$i = 1;
}
}
if ($chiffre_aleatoire_2 < $nombres_elements){
$chiffre_aleatoire_2 = $chiffre_aleatoire_2 + 1;
}
else{
$chiffre_aleatoire_2 = 1;
if($chiffre_aleatoire_2 == $chiffre_aleatoire_1){
$chiffre_aleatoire_2 = $chiffre_aleatoire_2 + 1;
}
}
}
}
echo 'chiffre aleatoire 1 :'.$tableau_valeurs_2[$chiffre_aleatoire_1];
echo '
chiffre aleatoire 2 :'.$tableau_valeurs_2[$chiffre_aleatoire_2];
?>


Qu'en pensez-vous ?
Sachant que la fonction me renvoi régulièrement deux messages d'erreurs pour des offsets indéfinis, et que parfois les deux nombres sont les mêmes !

3 réponses

JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
21 juin 2011 à 16:41
Une méthode qui marche pas mal pour ce genre de choses est de faire des permutations aléatoires sur ton tableau puis de prendre les indices dans l'ordre...

en gros (code pas testé, mais pour l'idée):
function nombreAleatoire($tableau){
   static $n = 0;
   for($i=0;$i<1000;$i++){
      $a = rand(0,count($tableau)-1);
      $b = rand(0,count($tableau)-1);
      $t = tableau[$a];
      $tableau[$a] = $tableau[$b];
      $tableau[$b] = $t;
   }
   return $tableau[$n++];
}
0
asdr Messages postés 9 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 21 juin 2011
21 juin 2011 à 17:00
J'aurai peut-etre du préciser que le deuxieme nombre tiré aléatoirement doit etre different des valeurs contenu dans le premier tableau à l'indexe qui a pour valeur le premier nombre tiré aléatoirement.

Exemple :

tableau1 = 1, 2 , 3 , 4

1 = 2,3,4
2 = 3,4
3 = 3
4 = 1,3

Imaginons que l'on tire le premier nombre :
2

Il faudra alors que le deuxième nombre soit différent de :
3 et 4
0
asdr Messages postés 9 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 21 juin 2011
21 juin 2011 à 17:39
Bon je vais changer ma logique de fonctionnement et faire en sorte que chaque nombre ne peut être tiré qu'une fois par jour, ainsi j'évite les doublons et je me facilite la vie !
0
Rejoignez-nous