Problème de hasard et répétitions - PHP - Programmation
Marsh Posté le 02-01-2005 à 23:18:14
Salut,
Tu peux :
- enlever l'élément affiché avec array_splice pour qu'il ne puisse plus être affiché
- OU utilise shuffle($tableau) qui va mélanger ton tableau et ainsi tu pourras y lire séquentiellement n élément sans avoir peur des doublons.
- ...
Marsh Posté le 02-01-2005 à 23:36:16
Je cherche des infos sur array_splice mais je misère un peu...
Quelqu'un pourrait-il me paramétrer ça ?
Merci ! Et Merci Tentacle !!
Marsh Posté le 02-01-2005 à 23:38:22
Ou sinon tout simplement array_rand(); qui me semble fait justement pour ce genre de truc
Marsh Posté le 02-01-2005 à 23:44:48
Désolé d'être loud, mais encore une fois je débute. J'ai mis 4 heures à pondre la chiure de code juste au dessus, et je ne sais pas comment appliquer vos conseils.
Si vous aviez le petit bout de code à ajouter, ça me permettrais d'etre fonctionnel ET d'apprendre un truc ! :-)
Merci encore
Marsh Posté le 03-01-2005 à 00:21:26
| bozobuzu a écrit : Désolé d'être loud, mais encore une fois je débute. J'ai mis 4 heures à pondre la chiure de code juste au dessus, et je ne sais pas comment appliquer vos conseils. |
Il n'y a pas de honte à être "loud", lit la doc des 3 fonctions array_rand, shuffle et array_splice, regarde les exemples.
Ensuite, en fonction de la fonction choisie, tu adaptes ton code
PS : la condition de ta boucle while est problématique, <= ne posera pas de problèmes si par hasard $i venait à changer dans la boucle ![]()
Marsh Posté le 03-01-2005 à 00:53:56
Bon, je me suis creusé la tete, et mon code donne ça :
<?
$fichier = "toto.txt";
if ($tableau = file($fichier)) {
$maxi = 15;
for($i=0; $i != $maxi ; $i++)
{
srand((double)microtime()*10000);
$nb = rand(0,sizeof($tableau)-1);
echo $tableau[$nb];
array_splice ($tableau, $nb);
}
echo ' ';
}
?>
Et ça marche ! Sympa, déjà !
Il ya juste un truc bizarre : de temps en temps, 4 ou 5 phrases s'affichent, puis 1 ou 2, et certaines fois, rien du tout !
Vous arriveriez à voir pourquoi ?
Marsh Posté le 03-01-2005 à 01:23:18
suis le conseil de Naceroth, un "!=" c'est dangereux il vaut mieux un "<=" paske si pour une raison x ou y, i dépasse maxi, ben avec ton code tu retrouvera alors dans une boucle infinie, et ça c'est pas bon comme truc...
je ne sais pas non plus à quoi ça te sert d'afficher un espace à la fin (echo ' '; )...
Mais la méga question:
Pourquoi mettre ça dans un if ?????????
Surtout que la condition d'un if, c'est en général un test (donc == ou ===), alors que toi tu fait une affectation (=)...
De meme si tu utilise une version de PHP supérieur ou égale à la 4.2.0, srand ne sert plus à rien, l'inialisation de rand est automatique.
Donc ton code abrégé doit pouvoir donner ça (j'ai pas testé)
Code :
|
count et sizeof sont des alias, donc ça marche aussi bien l'un que l'autre, j'ai mis count par habitude...
EDIT:
Au fait il doit y avoir un pb avec ton array_plice, là comme c'était écrit il me semble que tu efface bcp plus que seulement la ligne "nb" ce qui explique peut etre pkoi tu te retrouve à n'avoir que peu de valeur parfois.... comme tu ne donné pas de longueur "lenght", ça tronquait de la ligne "nb" jusqu'à la fin
Marsh Posté le 03-01-2005 à 01:42:26
| Xav_ a écrit : |
A ces questions fort pertinantes je réponds : parce que le débutant utilise les moyens du bord, CAD pas grand chose !
J'ai pas dépassé le stade du "if...else..." encore, mais j'avais besoin de ce script maintenant. En tout cas j'ai appris des trucs !
Merci pour tout Xav_, ça marche nikel !!!
Un vrai bonheur !!
Marsh Posté le 03-01-2005 à 01:46:23
on a tous débuté, mais il est important que tu comprenne tes erreurs afin de ne pas les refaire
--> c'est ce qui fait que tu ne sera pas un débutant toute ta vie
Je préfère que tu vienne avec un code à toi qui a des erreurs mais qui montre ta motivation plutot qu'un truc piqué ailleurs que tu n'aurais pas compris...
bon courage pour la suite, et reviens nous voir si tu as besoin ![]()
Marsh Posté le 03-01-2005 à 15:34:44
Code :
|
Marsh Posté le 03-01-2005 à 20:26:01
Je suis d'accord pour array_rand, mais j'étais gêné par le fait que la documentation ne précise pas si cette fonction peut ou non renvoyer des doublons.
Marsh Posté le 03-01-2005 à 20:40:53
A ce que j'ai compris ca devrais juste prendre l'array et le melanger ... donc pas de doublon possible ... mais j'ai pas fait le test
Marsh Posté le 03-01-2005 à 21:10:10
Tout comme shuffle tu veux dire alors ? (à part le nombre d'éléments souhaités)
Marsh Posté le 03-01-2005 à 21:15:31
C ce que je pensais au debut .. maintenant je commance a me demander .. parceque si tu passes comme nombres d'argument count($mon_array)+1 ... si c'est juste un shuffle qui permet de tirer les X premiers elements ... ca devrait donner une erreur
Marsh Posté le 02-01-2005 à 23:05:47
Bonjour,
Voila, j'aurais besoin d'un script pour sélectionner et afficher au hasard une quinzaine de phrases sur au moins 40.
Les phrases sont répertoriées dans un fichier texte.
Mon code donne ceci :
(c'est tout pourri, mais je suis novice en prog et j'essai petit à petit)
<?
$fichier = "toto.txt";
if ($tableau = file($fichier)) { // on crée un tableau à partir des lignes du fichier
$maxi = 15;
//----------[DEBUT BOUCLE]------------
for($i=0; $i != $maxi ; $i++)
{
srand((double)microtime()*10000);
$nb = rand(0,sizeof($tableau)-1); // on tire au hasard un élément du tableau
echo $tableau[$nb]; // affichage de la phrase correspondante
}
//------------[FIN BOUCLE]------------
echo ' ';
}
?>
Le problème, c'est qu'il arrive souvent qu'une phrases soit répétée 2 ou 3 fois.
Comment faire pour qu'il n'y ait pas de répétitions ??
Merci !!
Message édité par bozobuzu le 02-01-2005 à 23:07:15