Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2948 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Problème de hasard et répétitions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de hasard et répétitions

n°935414
bozobuzu
Posté le 02-01-2005 à 23:05:47  profilanswer
 

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
mood
Publicité
Posté le 02-01-2005 à 23:05:47  profilanswer
 

n°935420
Tentacle
Posté le 02-01-2005 à 23:18:14  profilanswer
 

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

n°935437
bozobuzu
Posté le 02-01-2005 à 23:36:16  profilanswer
 

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

n°935439
esox_ch
Posté le 02-01-2005 à 23:38:22  profilanswer
 

Ou sinon tout simplement array_rand(); qui me semble fait justement pour ce genre de truc

n°935441
bozobuzu
Posté le 02-01-2005 à 23:44:48  profilanswer
 

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


Message édité par bozobuzu le 02-01-2005 à 23:45:06
n°935455
naceroth
Posté le 03-01-2005 à 00:21:26  profilanswer
 

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

n°935462
bozobuzu
Posté le 03-01-2005 à 00:53:56  profilanswer
 

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 ?

n°935468
Xav_
The only one...
Posté le 03-01-2005 à 01:23:18  profilanswer
 

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 :
  1. <?
  2. $fichier = 'toto.txt';
  3. $tableau = file($fichier);
  4. $maxi = 15;
  5. for($i=0; $i<=$maxi; $i++)
  6.    {
  7.    $nb = rand(0,count($tableau)-1);
  8.    echo $tableau[$nb];
  9.    array_splice ($tableau, $nb, 1);
  10.    }
  11. ?>


 
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


Message édité par Xav_ le 03-01-2005 à 01:31:07

---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°935471
bozobuzu
Posté le 03-01-2005 à 01:42:26  profilanswer
 

Xav_ a écrit :


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


 
 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 !!!  :pt1cable:  Un vrai bonheur !!

n°935474
Xav_
The only one...
Posté le 03-01-2005 à 01:46:23  profilanswer
 

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


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
mood
Publicité
Posté le 03-01-2005 à 01:46:23  profilanswer
 

n°935806
ratibus
Posté le 03-01-2005 à 15:34:44  profilanswer
 

Code :
  1. <?php
  2. $fichier = 'toto.txt';
  3. $input = file($fichier);
  4. $maxi = 15;
  5. $rand_keys = array_rand ($input, $maxi);
  6. foreach( $rand_keys as $key ) {
  7.     echo $input[$key]."\n";
  8. }
  9. ?>

n°936071
Tentacle
Posté le 03-01-2005 à 20:26:01  profilanswer
 

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.

n°936085
esox_ch
Posté le 03-01-2005 à 20:40:53  profilanswer
 

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

n°936106
Tentacle
Posté le 03-01-2005 à 21:10:10  profilanswer
 

Tout comme shuffle tu veux dire alors ? (à part le nombre d'éléments souhaités)

n°936119
esox_ch
Posté le 03-01-2005 à 21:15:31  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Problème de hasard et répétitions

 

Sujets relatifs
[Debian][FMOD] Probleme enregistrement au microaide : problème pour un compteur de visiteur sur un site
probleme de cookieProblème avec un code PHP
Probleme avec un scroll Pane :(Problème Image + Date
Problème insertion d'image en htmlprobleme d'importation de fichier
[urgent] probleme récupération fichier ftpRe probleme avec les tableaux
Plus de sujets relatifs à : Problème de hasard et répétitions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR