Page 1 sur 1
Génération d'un mot
Posté : 24 oct. 2005, 16:20
par Invité
Bonjour, je voudrais savoir comment en PHP peut on générer un mot au hasard ? (à partir d'une liste de lettres stockée dans une variable)
Je pense qu'il faut utiliser des boucles imbriquées, mais je vois pas trop comment après...
Posté : 24 oct. 2005, 16:22
par eirwan
Excusez moi j'avais oublié de me loguer...

Posté : 24 oct. 2005, 16:25
par charabia
De ce genre là ?
<?php
$tableau = array("a", "b", "c" .......... "7", "8", "9");
$valeurs_aleatoires = array_rand($tableau, 8);
$mot_alea = "";
foreach($valeurs_aleatoires as $i)
{
$mot_alea = $mot_de_passe . $tableau[$i];
}
echo "Le mot aléatoire est : " . $mot_alea;
?>
Posté : 24 oct. 2005, 16:34
par eirwan
Je vois a peu près ce que ton script fais, mais je ne comprends pas ce que représennte $i par contre... Mais oui c'est ça qu'il me faut !
Posté : 24 oct. 2005, 16:35
par Xenon_54
Cela suppose qu'une lettre ne peut pas être utilisée plus que 2 fois.
Tu peux toujours utiliser cette fonction si tu veux utiliser plus d'une fois la même lettre:
<?php
function randomString( $length = 6, $char = 'abcdefghijklmnopqrstuvwxyz0123456789' ) {
$str = '';
$max = strlen($char)-1;
for ($i=1; $i<=$length; $i++) {
$str .= $char[ rand(0, $max) ];
}
return $str;
}
?>
Posté : 24 oct. 2005, 16:38
par zeus
Cela suppose qu'une lettre ne peut pas être utilisée plus que 2 fois.
pourquoi donc ?
Outre le fait qu'il manque un modulo pour ne pas dépasser la taille du tableau, je ne vois pas la différence majeure entre vos fonctions
Posté : 24 oct. 2005, 16:47
par eirwan
Merci pour vos réponses, mais bon je suis quand même un noob, donc voilà, mon but c'est pas de faire du copier coller mais de les comprendre, et là ça coince !
Ben déjà, je vois qu'il y en a une de basée sur un tableau et une autre sur une variable (vous me dites si j'ai faux, hein).
Mais , Xenon_54, pourquoi tu enlèves 1 à la valeur de $char ?
Et que veut dire cette notation ?
$str .= $char[ rand(0, $max) ];
Ca veut dire que $char est un tableau ?
Posté : 24 oct. 2005, 16:48
par Xenon_54
Cela suppose qu'une lettre ne peut pas être utilisée plus que 2 fois.
pourquoi donc ?
Outre le fait qu'il manque un modulo pour ne pas dépasser la taille du tableau, je ne vois pas la différence majeure entre vos fonctions
Le mec prend un tableau de caractères et le mélange en récupérant 8 caractères pour ensuite récupérer les index pour refaire une boucle.
Donc les problèmes suivants de posent:
1) Une lettre ne peut être réutiliser plus d'une fois à moins de l'insérer plus d'une fois dans le tableau de départ.
2) Il utilise une variable indéfinie et écrase ainsi à chaque tour de boucle la variable qu'il tente de construire.
Perso, je conseille de générer 8 chiffres aléatoirement et récupérer les lettres qui y sont associés dans le tableau comme le montre mon exemple.
Posté : 24 oct. 2005, 16:49
par zeus
parce que un tableau est indexé de 0 à n et que s'il contient 2 valeurs, la dernière case est la case qui comporte l'index 1
Pour obtenir le plus grand index d'un tableau, tu predn sa taille -1
Posté : 24 oct. 2005, 16:53
par eirwan
Et pour charabia, dans cette ligne :
$mot_alea = $mot_de_passe . $tableau[$i];
Euh c'est quoi cette variable $mot_de_passe ? je vois pas d'où elle sort...

Posté : 24 oct. 2005, 16:54
par zeus
Le mec prend un tableau de caractères et le mélange en récupérant 8 caractères. Ensuite il utilise une boucle foreach() pour toutes les concatener alors que implode() aurait suffit.
Il génère un tableau de 8 valeurs aléatoires
Ensuite il parcours ce tableau de valeurs aléatoires et récupérant la lettre correspondante dans le tableau qui contient les caractères
Finalement, il l'ajoute à une chaine initialisé à ""
je ne voit que 2 erreurs :
1°) pourquoi un tableau pour contenir les lettres alors qu'une chaine, comme toi, aurait suffit
2°) Quand il fait la concaténation, il s'est trompé sur le nom de la variable de gauche de l'opérateur d'attribution =
]Donc les problèmes suivants de posent:
1) Une lettre ne peut être réutiliser plus d'une fois à moins de l'insérer plus d'une fois dans le tableau de départ. Non puisque s'il utilise un tableau de valeur aléatoire
2) L'utilisation d'une boucle foreach() alors que implode() aurait suffit. idem
3) Il utilise une variable indéfinie et écrase ainsi à chaque tour de boucle la variable qu'il tente de construire.d'accord
Posté : 24 oct. 2005, 16:54
par charabia
Oups une simple erreur
C'est
Posté : 24 oct. 2005, 17:07
par eirwan
Ok ben ça marche et je crois que j'ai compris , la vie est belle
Merci pour votre aide, vous êtes vraiment très rapides !
Posté : 24 oct. 2005, 17:47
par Xenon_54
Non puisque s'il utilise un tableau de valeur aléatoire
Je viens de tester la fonction plusieurs fois et la fonction array_rand() retourne un nombre d'élément donné aléatoirement mais jamais plus d'une fois le même élément.
D'où la question de savoir s'il veut plus d'une fois la même lettre ou pas. Normalement un mot peut contenir plusieurs fois la même lettre.

Posté : 24 oct. 2005, 19:55
par zeus
Je viens de tester la fonction plusieurs fois et la fonction array_rand() retourne un nombre d'élément donné aléatoirement mais jamais plus d'une fois le même élément.

OK
Dans la doc de phpinfo, il n'y avait rien de stipuler sur cette aspect ni sur array_rand, ni sur rand donc je me posait la question.
Merci de tes précisions
