Page 1 sur 3

Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 00:51
par diabless6
Bonsoir :wink:

Je continue mon initiation avec monsieur PHP et je m'intéresse à la notion aléatoire sans arrière penser de gagner au loto biensure :^o :mrgreen:

J'ai confectionné ce script dans ma cuisine avec 2 méthodes:
<?php
srand ((float)microtime()*1000000);
$tab=range(1,49);
shuffle($tab);
for ($tirage=0;$tirage<=5;$tirage++)
{
list($cle,$valeur)=each($tab);// 5ers du tableaux(pas de doubles)(1)
$val=array_rand($tab);//problème de double(2)
print $tab[$val]."*";
print ".".$valeur;
 // print_r($tab);
}
?>
Une ou je me casse pas la tête, je prends les 5er numéros du tableau étant donné que celui-ci à été shuffler aucun soucis de double. Mais cette ligne je l'ai trouvé dans un exemple de mon livre et je ne la trouve pas séduisante(1).

Par contre la( 2) me plait mieux, mais elle peux tirer 2 fois ou plus la même valeur et dans ce qu'a la ça met pas évident de formuler des conditions classiques.
Donc j'aurai besoin de la clairvoyance des messieurs experts du forum.

Merci

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 10:47
par macgawel
Bonjour.

Pour la deuxième méthode, RTFM :twisted: :
array_rand accepte un deuxième paramètre facultatif, num_req, qui
Spécifie le nombre d'entrées que vous voulez récupérer.
Si j'ai bien compris, ça devrait faire ton bonheur...

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 20:12
par Elie
L'exemple est explicite :)
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 22:12
par diabless6
Fausse joie, ça ne fait pas ce que je veux !

48.37.25.30.32.37.
$val=array_rand($tab,1)

Ya 2 fois 37 !

ou alors ça :
Warning: Illegal offset type -->print $tab[$val].".";
avec ($tab,5);
#-o

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 22:36
par niuxe
Hello,

C'était évident qu'il y ait la possibilité d'une valeur doublée. En te donnant une piste à suivre :
$tab=range(1,49);
$valeur_trouvee = array();
for ($tirage=0;$tirage<=5;$tirage++){
	$val=array_rand($tab);
	if (!in_array($tab[$val],$valeur_trouvee)){
		$valeur_trouvee[] = $tab[$val];
	}else{
		$tirage--;
	}
}

echo implode(".",$valeur_trouvee);
*code fait de tête. Je peux m'être trompé.

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 22:42
par diabless6
On peut faire du code sans la tête ? :mrgreen:
Laisse moi décrypter ton code, ça devient une passion chez moi :twisted:

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 23:09
par niuxe
On peut faire du code sans la tête ? :mrgreen:
<mode dialogue="en forme de tringle">
Quand on a pas de tête, on a des jambes...
Oui, mais si on a pas de tête, comment peut on prendre ses jambes à son coup ?
</mode>

:lol:

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 23:14
par diabless6
$tab=range(1,49);
//création du tableau avec 49 chiffres
$valeur_trouvee = array();//création d'un 2ème tableau vide
for ($tirage=0;$tirage<=5;$tirage++){// boucle pour 1 tirages de 5 chiffs
    $val=array_rand($tab);//retourne un indice aléatoire et le place en $val
        if (!in_array($tab[$val],$valeur_trouvee)) 
        {
                $valeur_trouvee[] = $tab[$val];
        }else{
                $tirage--;
        }
}

echo implode(".",$valeur_trouvee);//convertion tableau en caractères

?>

Je peine un peu à traduire la condition #-o

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 23:24
par niuxe
// si dans le tableau, tu ne trouves pas (!in_array...) la valeur trouvée aléatoirement
if (!in_array($tab[$val],$valeur_trouvee)){
       //tu insères la valeur dans ce tableau
        $valeur_trouvee[] = $tab[$val];
        }else{
        //sinon le tirage devra être relancé
        $tirage--;
}
Je t'encourage à lire la documentation sur la fonction native de php 5 : in_array(). Au passage, là pour les besoins de compréhension de la structure de controle, j'ai commenté toutes les lignes. Dans un script en générale, ce n'est pas à faire. Il est préférable de commenter un bloc d'action (qu'est ce qui fait, qu'est ce qu'il retourne ? , etc.).

<<<EDIT
Toutefois, on peut commenter une ligne dans un bloc (une opération ou une valeur spécifique). Pense que trop de commentaires peuvent tuer les commentaires. Aussi, il faut tenir scrupuleusement à jour les commentaires ! Rien de plus contrariant qu'un commentaire erroné.
EDIT;

Bonne soirée à toi :)

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 23:31
par diabless6
Merci, mais j'ai un livre qui me dit qui fait quoi.

On prends la traduction littéral de "The dog day" --> le jour du chien

Hors ça veux simplement dire " la canicule".

Le php c'est le même concept mais en plus algébrique et d'ou faut avoir l'habitude quant on débute ! :?

Re: Maîtrise du pseudo aléatoire

Posté : 12 janv. 2010, 23:57
par diabless6
si dans in_array() = la valeur du tableau $tab[$val] est présente dans le tableau $valeur_trouvee
(si in_array différent de true alors :)

alors si oui on ajoute $tab[$val] dans $valeur_trouvee[]

sinon on décrémente $tirage-- (ça revient à faire une boucle en arrière ?!)


Si $tab[$val] contient 3 et qu'il soit dans $valeur_trouvée (3)

or il n'est pas différent donc on va sur le else.


Je crois que j'ai pigé :D

Merci bp Nolem

Re: Maîtrise du pseudo aléatoire

Posté : 14 janv. 2010, 16:20
par diabless6
coucou !

J'aime bien ton code, je le garde précieusement. Mais ce que j'essaie de faire, tourner ce petit bout de code dans une autre salade pour débrider mon esprit cartésien :mrgreen:

Il me semblait que cette façon-ci pourrait fonctionner aussi :
<?php
$tab[] = mt_rand(1,49);
$tab_tirage = array();
for ($tirage=0;$tirage<=5;$tirage++){

if(!in_array($tab[$val],$tab_tirage))
{
  $tab_tirage[]=$tab[$val];
}
else { $tirage--; }
}
echo implode(".",$tab_tirage).'<br/>';
//var_dump($tab);
exit;
?>
Mais mon Apache patine le CPU, comme une boucle infinie. Pourquoi ça ne marche pas ?
Merci

Re: Maîtrise du pseudo aléatoire

Posté : 14 janv. 2010, 16:52
par niuxe
Hello Diabless6,

Je vois que tu as saisie le principe mais tu as fais une légère erreur d'appréciation sur un autre point. En lisant ton code, on s'aperçoit que tu utilises mt_rand (très judicieux, plus rapide que rand). Pour t'orienter vers la solution, je vais te poser une question essentiel : Combien de valeur a $tab ? une ou 6 ? ;) Si tu sais répondre à cette question, tu vas comprendre pourquoi ta boucle tourne indéfiniment. ;)

Bonne journée à toi.

ps : Pour ton soucis sur Alsacreations, Google envoi ton mail dans les spams lorsque tu t'auto envoi un mail par un script perso : adresse expéditeur = adresse destinataire.

Re: Maîtrise du pseudo aléatoire

Posté : 14 janv. 2010, 19:23
par diabless6
En faites, je pense si je réponds bien à ta question qui me triture la cervelle :
$tab[] = mt_rand(1,49);
ça me renvoie juste 1 nombre entre 1 et 49.
Donc dans la condition, $tab[$var] et $tab_tirage contient réciproquement le même nombre à chaque itération de la boucle.
D'ou une boucle sans fin =D>
Je viens de faire pété un neurone :mrgreen: Tes un Amour ! :priere:

Mais j'ai essayé de mettre $tab[] = mt_rand(1,49); dans une boucle mais ça fait pareil ou alors je m'y prends mal.
j'ai même fait comme ça mt_rand(1,$i); mais je crois que ça n'a pas fait ce que je voulais.

Re: Maîtrise du pseudo aléatoire

Posté : 14 janv. 2010, 20:08
par niuxe
En faites, je pense si je réponds bien à ta question qui me triture la cervelle :
$tab[] = mt_rand(1,49);
ça me renvoie juste 1 nombre entre 1 et 49.
Donc dans la condition, $tab[$var] et $tab_tirage contient réciproquement le même nombre à chaque itération de la boucle.
D'ou une boucle sans fin =D>
+1 =D>
Je viens de faire pété un neurone :mrgreen:
Avec PHP, il ne me reste plus beaucoup de neurones d'ailleurs. :lol:
Tes un Amour ! :priere:
:oops:

Pour t'amener à la solution par ta manière (mt_rand), Dans la boucle, as tu besoin d'une seule valeur ou plusieurs valeur ($integer ou $array) générée à chaque itération de la boucle ?

Au passage, veux tu un cachet d'aspirine ? :mrgreen:

Bonne soirée à toi.

ps : +1 pour essayer d'élaborer par toi même une autre piste. :)