Génération d'un mot

Invité
Invité n'ayant pas de compte PHPfrance

24 oct. 2005, 16:20

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

Eléphanteau du PHP | 14 Messages

24 oct. 2005, 16:22

Excusez moi j'avais oublié de me loguer... :roll:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

24 oct. 2005, 16:25

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;

?>

Eléphanteau du PHP | 14 Messages

24 oct. 2005, 16:34

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 !

Mammouth du PHP | 1885 Messages

24 oct. 2005, 16:35

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;
}
?> 
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 oct. 2005, 16:38

Cela suppose qu'une lettre ne peut pas être utilisée plus que 2 fois.
pourquoi donc ? :shock:
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
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éphanteau du PHP | 14 Messages

24 oct. 2005, 16:47

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 ?

Mammouth du PHP | 1885 Messages

24 oct. 2005, 16:48

Cela suppose qu'une lettre ne peut pas être utilisée plus que 2 fois.
pourquoi donc ? :shock:
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.
Modifié en dernier par Xenon_54 le 24 oct. 2005, 16:50, modifié 1 fois.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 oct. 2005, 16:49

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
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éphanteau du PHP | 14 Messages

24 oct. 2005, 16:53

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 oct. 2005, 16:54

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

Avatar du membre
ViPHP
ViPHP | 3008 Messages

24 oct. 2005, 16:54

Oups une simple erreur :)

C'est

Code : Tout sélectionner

$mot_alea = $mot_alea . $tableau[$i];

Eléphanteau du PHP | 14 Messages

24 oct. 2005, 17:07

Ok ben ça marche et je crois que j'ai compris , la vie est belle :lol:
Merci pour votre aide, vous êtes vraiment très rapides !

Mammouth du PHP | 1885 Messages

24 oct. 2005, 17:47

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.

;)
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 oct. 2005, 19:55

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 :pouce:
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