Maîtrise du pseudo aléatoire

Eléphant du PHP | 250 Messages

14 janv. 2010, 20:33

Au passage, veux tu un cachet d'aspirine ? :mrgreen:
c'est pas bon signe pour moi ça #-o

$tab[] = mt_rand(array(1),array($i));

Je suis un peu larguée là, je chauffe ou pas du tout ? :|
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

15 janv. 2010, 00:35

Là tu t'égares au niveau des paramètres de mt_rand. Les arguments initiaux étaient justes puisque tu cherches une valeur comprise entre 1 et 49.

Admettons que les fonctions natives de PHP créant un nombre aléatoire n'existent pas, il faudrait de par ce fait les coder, n'est ce pas ? Au passage, si tu ne sais pas créer une fonction personnelle, je t'invite à lire ce tuto : les fonctions et n'hésite pas à poser des questions dans un nouveau sujet. ^^

En se l'imaginant un peu, ce serait un truc comme :
function creer_nombre_aleatoire($premier_parametre=null,$second_parametre=null){
	//action

	//retourne une valeur numérique (!)
}
Donc dans ta boucle, tu as besoin d'une seule ou plusieurs valeurs retournées par la fonction pour utiliser correctement ta conditionnelle ?

Bonne soirée à toi ^^
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

ViPHP
AB
ViPHP | 5818 Messages

15 janv. 2010, 03:45

Admettons que les fonctions natives de PHP créant un nombre aléatoire n'existent pas, il faudrait de par ce fait les coder, n'est ce pas ?
J'ai pas tout suivi en détail, mais à partir du moment où tu code, à mon avis tu ne peux faire que du pseudo aléatoire.
Eventuellement les paramètres pour générer l'aléatoire peuvent être différents, mais je ne vois pas comment à l'arrivée on pourrait affirmer qu'on a un nombre réellement aléatoire :-k

EDIT : Ah oui, je viens de saisir le contexte, tu voulais parler de pseudo aléatoire, et c'était un exemple. Désolé de cette remarque décalée :wink:

Eléphant du PHP | 250 Messages

15 janv. 2010, 15:14

<?php
function nb_alea()
{
  $val=mt_rand(1,49);
  echo $val;
  return ($val);
}
//nb_alea();
?>

<?
function tirage($nombre)
{
    $r="";
    for ($tirage=0;$tirage<=5;$tirage++)
    {
	if ($nombre==$r)
	{
	   tirage(nb_alea());
	}
	else {$r.=$nombre;}
    }
echo $r.".";

}
tirage(nb_alea());
?>
Comme je tournais en rond, j'ai pondu ça, une autre approche avec des fonctions, mais c'est pas parfait et je m'enfonce encore plus :evil:

ou celui là, je sûr que je touche au but j'ai juste des "Notices":
<?php
function nb_alea()
{
  $val=null;
  $val=mt_rand(1,49);
  echo $val;
//print_r($val);
  return ;
}

$tab_tirage = array();
for ($tirage=0;$tirage<=5;$tirage++){

if(!in_array($tab[nb_alea()],$tab_tirage))
{
  $tab_tirage[]=$tab[$val];
}
else { $tirage--; }
}
echo implode(".",$tab_tirage).'<br/>';
//var_dump($tab_tirage);
exit;
?>
Doit y manqué un oeuf je pense car la recette n'est pas parfaite :cry:
I am not a cordon bleue du PHP :roll:
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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 janv. 2010, 16:17

Modération :
diabless6 , la balise [php] permet une mise en forme suffisamment claire pour ne pas avoir à le mettre en plus gros, ou en gras.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 453 Messages

15 janv. 2010, 16:36

Hello,
Comme je tournais en rond, j'ai pondu ça, une autre approche avec des fonctions, mais c'est pas parfait et je m'enfonce encore plus :evil:

ou celui là, je sûr que je touche au but j'ai juste des "Notices":

<?php
function nb_alea()
{
  $val=null;
  $val=mt_rand(1,49);
  echo $val;
//print_r($val);
  return ;
}

$tab_tirage = array();
for ($tirage=0;$tirage<=5;$tirage++){

if(!in_array($tab[nb_alea()],$tab_tirage))
{
  $tab_tirage[]=$tab[$val];
}
else { $tirage--; }
}
echo implode(".",$tab_tirage).'<br/>';
//var_dump($tab_tirage);
exit;
?>
[/b]

Doit y manqué un oeuf je pense car la recette n'est pas parfaite :cry:
I am not a cordon bleue du PHP :roll:
La deuxième est plus proche de la solution. Je pense qu'avec la solution et le message d'erreur de départ (de mémoire illegal offset) vont te permettre de comprendre mieux. C'est plus simple que ça.
$tab_tirage = array();
for ($tirage=0;$tirage<=5;$tirage++){
  $val_al = mt_rand(1,49); //retourne un integer (!) et sera régénéré 6 fois voir plus s'il y a des concordances
  if(!in_array($val_al,$tab_tirage)){
    $tab_tirage[]=$val_al;
  }else { 
    $tirage--; 
  }
}
echo implode(".",$tab_tirage).'<br/>';

//maniere initiale
$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 6 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
Que veut dire le fameux illegal offset ... : souvent ce message apparait lorsque la boucle parcours plus que le nombre de clef dans un array. De tout manière in_array attend une valeur. Que ce soit ce genre de syntaxe : $tab[$clef] ou ceci : $valeur, c'est du pareil au même.

Quand je t'ai parlé d'une fonction personnelle, je voulais mettre le point sur la valeur retournée. Est ce une booléenne (true/false ou 0/1), tableau, string, integer ? Si mt_rand retourne un array (toujours essayer de connaître la signature et la valeur retournée d'une fonction), le tableau sera parcouru plus qu'il ne faut ou que le parcours sera tout simplement erroné.

Au passage, à propos de ta fonction personnelle, elle retourne quoi ? Ce serait plutôt ceci :
function nb_alea()
{
  $val=null;
  $val=mt_rand(1,49);
  return $val;
}

$val = nb_alea(); //retourne un int compris entre 1 et 49 

@AB => pas de soucis :)
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 250 Messages

15 janv. 2010, 17:04

<?php
function nb_alea()
{
  $val=mt_rand(1,49);
   return ($val);
}

function affic_tirage()
{
$tab_tirage = array();
for ($tirage=0;$tirage<=5;$tirage++){

if(!in_array(nb_alea(),$tab_tirage))
{
  $tab_tirage[]=nb_alea();
}
else { $tirage--; }
}
echo implode(".",$tab_tirage).'<br/>';

exit;
return;
}

affic_tirage();
?>
C'est mieux là hein niuxe :wink:
Mais j'avous d'ailleurs que en parlant de syntaxe $tab[$clef] ou ceci : $valeur ça me pertube beaucoup et peut être parce que j'ai pas du tout l'habitude de travailler avec des tableaux, j'ai passé ce chapitre en le survolant.

Juste que Mt_rand ne retourne pas un tableau:
Un entier aléatoire compris entre min (ou 0) et max

in_array — Indique si une valeur appartient à un tableau(comparaison)

En faisant ça $val=mt_rand(1,49); hors ici quand je fais un print_r j'ai pas un tableau ? ça m'affiche juste le contenu de la variable $val.
function nb_alea()
{
  $val=mt_rand(1,49);
  //echo $val;
  return ($val);
}
print_r(nb_alea());
var_dump(nb_alea());
ça me retourne pas un tableau ! j'ai juste un Integer. Comme tu le dis plus haut, faut pas mélanger les serviettes et les torchons ensembles.
!in_array(nb_alea(),$tab_tirage) en gras ya un tableau vide et à coté j'ai une variable qui contient mon nombre aléatoire qui n'est pas du type array, a moins que je me trompe.
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

15 janv. 2010, 17:46

Zut la condition ne fonctionne plus 33.34.49.26.49.23 j'ai des doubles avec mes fonctions alors que ça ressemble à ce que tu as écrit mais sans fonction ! J'ai raté un truc là #-o
J'ai légèrement modifié:
$nombre=nb_alea();
if(!in_array($nombre,$tab_tirage))
{
  $tab_tirage[]=$nombre;
et la condition fonctionne mieux ! :D Mais à ta façon, le script est plus rapide, j'ai l'impression :roll: .
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.

ViPHP
AB
ViPHP | 5818 Messages

15 janv. 2010, 19:29

j'ai pas du tout l'habitude de travailler avec des tableaux, j'ai passé ce chapitre en le survolant...
Juste un conseil en passant, si tu as du temps de libre ce serait bien de t'y mettre sérieusement... c'est une grosse partie qui t'avancera beaucoup. En php on fait des miracles avec les tableaux et il existe moult fonctions natives pour les manipuler dans tous les sens :wink:

Eléphant du PHP | 250 Messages

15 janv. 2010, 20:13

oui, les tableaux semblent être omniprésent en PHP et je commence à en prendre concience qui va falloir que je travaille la chose.

Là je suis vraiment agacée, car j'ai un copain sur msn qui me dit faut pas utiliser mt_rand() :|

Alors fallait pas utilise rand() non plus :evil:

Il faut que j'utilise mt_srand() pouuuua!!!! et il est encore différent celui là dans sa syntaxe #-o

Avec le PHP j'ai l'impression qui faille toujours se remettre en cause 8-|
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

15 janv. 2010, 21:01

Juste un conseil en passant, si tu as du temps de libre ce serait bien de t'y mettre sérieusement... c'est une grosse partie qui t'avancera beaucoup. En php on fait des miracles avec les tableaux et il existe moult fonctions natives pour les manipuler dans tous les sens :wink:
+10...

Cependant, je me souviens que lorsque j'ai commencé à apprendre le PHP, beaucoup de choses étaient floues. Je me souviens que j'avais un peu de mal à comprendre la logique. Surtout un array multidimensionnel sur quatre niveau en exemple. Certaines fonctions natives de PHP à propos des array sont un peu difficile à aborder pour un débutant je crois (ex : array_walk, array_filter).

Ce que je peux te donner comme conseil Diabless, lorsque tu butes sur une explication/concept dans ton livre. Passe au chapitre suivant. Si ton bouquin est bien fait et qu'il a plusieurs parties, continue ta lecture jusqu'à la fin de la partie courante. Sinon, avance de un ou deux chapitres. Parce qu'après il y a des chances que tu ne saisisses pas un chapitre ou les subtilités du livre. MAIS si tu sautes un paragraphe ou un chapitre, prend toi un moment au calme et lie ton chapitre en essayant de faire les scripts présentés. Après quelques chapitres suivant ton étude, revient sur le chapitre « problème » toujours dans le calme. Une fois terminé le livre, tu as trois options. Faire les trois, c'est mieux ^^.

[*]mettre à exécution ce que tu viens d'apprendre. (pourquoi pas mais faire des petits scripts au début. ex : scanner un repertoire, manipuler des fichiers, connecter à une base, gérer la base, etc.)[/*]
[*]lire un autre livre sur le sujet. Ça permet d'appréhender d'une autre manière PHP. Souvent, dans d'autres livres certains concepts sont mieux expliqués que d'autres. Par exemple un livre qui m'a permit de comprendre pas mal de choses : Introduction à PHP 5. O'reilly :love4: À noter que si tu veux ce livre, tu devras te tourner vers l'occasion pour la version papier ou sinon la version numérique se trouve ici. [/*]
[*]relire ton livre pour mieux apprécier ses subtilités.[/*]

D'une manière générale :
Il suffit de concentrer son esprit pour y arriver.
Je rajouterai, il faut persévérer dans ce que l'on fait.
Mais à ta façon, le script est plus rapide, j'ai l'impression :roll: .
<mode sadique_nevrose="on">
Ha, ha Bonne question... En PHP, tu peux le savoir. Le principe :

[*]fixer le temps de début du script[/*]
[*]fixer le temps de fin de script[/*]
[*]afficher temps d'exécution = temps de fin de script - temps de début du script[/*]

Pour faire cette manip, microtime() et echo() ou print() sont tes amis si je ne m'abuse.
Pourquoi n'essaies tu pas ? :twisted:
</mode>
^^
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 453 Messages

15 janv. 2010, 21:09

oui, les tableaux semblent être omniprésent en PHP et je commence à en prendre concience qui va falloir que je travaille la chose.

Là je suis vraiment agacée, car j'ai un copain sur msn qui me dit faut pas utiliser mt_rand() :|

Alors fallait pas utilise rand() non plus :evil:

Il faut que j'utilise mt_srand() pouuuua!!!! et il est encore différent celui là dans sa syntaxe #-o

Avec le PHP j'ai l'impression qui faille toujours se remettre en cause 8-|
Le principe est d'aller droit au but, la manière peut être secondaire. Là dans ton cas, mt_rand suffit amplement.
Le principale est de connaître un minimum pour pouvoir parler. Maintenant tu sais qu'il existe une autre fonction pour générer un nombre aléatoire. Plus tard, tu pourras revenir dessus ou/et en avoir besoin.

Aller courage ^^
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

ViPHP
AB
ViPHP | 5818 Messages

16 janv. 2010, 05:48

Et pour générer un identifiant unique (ce n'est pas le sujet mais ça peut servir), il y a uniqid http://php.net/manual/fr/function.uniqid.php

Eléphant du PHP | 250 Messages

16 janv. 2010, 21:01

J'ai 2 livres et je compte bien les usés.... :mrgreen:
for ($en_six=0;$en_six<=5;$en_six++){
$resultat=array();
//print_r($numbers);
for($i=0;$i<=49;$i++)
{
    $numbers= range(1, $i);
    shuffle($numbers);
    for ($a=0;$a<=43;$a++)
    {unset($numbers[$a]);}//retire 43 numéro à partir de la fin
    if (in_array($numbers,$resultat))
    {$en_six--;$a--;}
    else{$resultat=$numbers;}

}
echo implode(".",$numbers).'<br/>';}
//var_dump($numbers);
//print_r($resultat);
?>
C'est pas là aussi, mais c'est un peu tordu :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.

ViPHP
AB
ViPHP | 5818 Messages

16 janv. 2010, 22:42

Suivant ton principe tu peux faire ceci
$nombre_valeur_a_retourner = 50;

$resultat = array();

while (count($resultat) < $nombre_valeur_a_retourner)
{
$resultat[] = mt_rand(0,49);
$resultat = array_unique($resultat);
}

echo '<pre>';
print_r($resultat);
echo '</pre>';
Remarque bien que ce n'est pas optimisé par rapport à la solution 1 de ton livre.

J'ai fait exprès de mettre 50 pour que tu puisse voir le nombre de boucles nécessaire à l'élaboration de la liste en regardant simplement l'index du dernier élément du tableau. Théoriquement avec pas de chance tu pourrais même avoir un temps de réponse infini d'autant plus que tu te rapproche du nombre d'éléments maximum.

Donc cette solution même si elle est écrite plus simplement que tes essais (avec le même principe) est à proscrire.

Bon allez, arrête de faire mumuse avec les nombres aléatoires et passe à la suite. La route est longue et si tu t'amuses à chercher tout ce qu'il ne faut pas faire, t'es pas rendue (comme on dit) :wink: