Problème de hasard et répétitions

Problème de hasard et répétitions - PHP - Programmation

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
Reply

Marsh Posté le 02-01-2005 à 23:05:47   

Reply

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

Reply

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

Reply

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

Reply

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


Message édité par bozobuzu le 02-01-2005 à 23:45:06
Reply

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

Reply

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 ?

Reply

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

Marsh Posté le 03-01-2005 à 01:42:26    

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

Reply

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


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 03-01-2005 à 01:46:23   

Reply

Marsh Posté le 03-01-2005 à 15:34:44    

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

Reply

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.

Reply

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

Reply

Marsh Posté le 03-01-2005 à 21:10:10    

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

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed