Maîtrise du pseudo aléatoire

Eléphant du PHP | 250 Messages

12 janv. 2010, 00:51

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
Modifié en dernier par diabless6 le 18 janv. 2010, 21:52, modifié 2 fois.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 672 Messages

12 janv. 2010, 10:47

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...

Mammouth du PHP | 1339 Messages

12 janv. 2010, 20:12

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";
?>
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 250 Messages

12 janv. 2010, 22:12

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
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 453 Messages

12 janv. 2010, 22:36

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é.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 250 Messages

12 janv. 2010, 22:42

On peut faire du code sans la tête ? :mrgreen:
Laisse moi décrypter ton code, ça devient une passion chez moi :twisted:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 453 Messages

12 janv. 2010, 23:09

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:
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 250 Messages

12 janv. 2010, 23:14

$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
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 453 Messages

12 janv. 2010, 23:24

// 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 :)
Modifié en dernier par niuxe le 12 janv. 2010, 23:36, modifié 2 fois.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 250 Messages

12 janv. 2010, 23:31

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 ! :?
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

12 janv. 2010, 23:57

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
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

14 janv. 2010, 16:20

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
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 453 Messages

14 janv. 2010, 16:52

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.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 250 Messages

14 janv. 2010, 19:23

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.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 453 Messages

14 janv. 2010, 20:08

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. :)
Modifié en dernier par niuxe le 15 janv. 2010, 00:43, modifié 1 fois.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia