Tirage au sort MAIS sans doublons ...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tirage au sort MAIS sans doublons ...

Re: Tirage au sort MAIS sans doublons ...

par sirakawa » 27 juil. 2012, 14:38

Sinon, si tu veux uniquement avoir le rendu que tu as sur le site que tu as donné, il y'a une solution assez simple et rapide. Reste à voir si tu veux améliorer ton script par la suite et de quelle facon.
Je me demande si on ne pourrait pas:
<?php
$joueurs = $_POST['joueurs'];
$cadeaux = $_POST['cadeaux'];
$gagnants = array(); // initialisation d'un tableau des gagnants
while(count($gagnants) < $cadeaux ){ // on boucle tant que le nombre de gagnants est inférieur au nombre de cadeaux
    $rand = mt_rand(1,$joueurs); // on génère un nombre aléatoire entre 1 et le nombre de joueurs
/*remplacer
    if(!in_array($rand,$gagnants)) {  // on vérifie si le nombre à déjè été tiré*/
par*/
    while (in_array($rand, $gagnants))
    {
       $rand = mt_rand(1,$joueurs);
    }
   $gagnants[] = $rand; // on insère le numéro dans le tableau gagnant
   echo 'joueur n° '.$rand.'<br />'; // on affiche la valeur


?>
J'ai commenté au max pour que tu comprenne.

Re: Tirage au sort MAIS sans doublons ...

par Zahnzao » 27 juil. 2012, 11:20

Sinon, si tu veux uniquement avoir le rendu que tu as sur le site que tu as donné, il y'a une solution assez simple et rapide. Reste à voir si tu veux améliorer ton script par la suite et de quelle facon.
<?php
$joueurs = $_POST['joueurs'];
$cadeaux = $_POST['cadeaux'];
$gagnants = array(); // initialisation d'un tableau des gagnants
while(count($gagnants) < $cadeaux ){ // on boucle tant que le nombre de gagnants est inférieur au nombre de cadeaux
    $rand = mt_rand(1,$joueurs); // on génère un nombre aléatoire entre 1 et le nombre de joueurs
    if(!in_array($rand,$gagnants)) {  // on vérifie si le nombre à déjè été tiré
	$gagnants[] = $rand; // on insère le numéro dans le tableau gagnant
	echo 'joueur n° '.$rand.'<br />'; // on affiche la valeur
    }
}
?>
J'ai commenté au max pour que tu comprenne.

Re: Tirage au sort MAIS sans doublons ...

par DiurnaSys » 27 juil. 2012, 11:02

Bonjour,

Oui très tout comme la réponse juste au dessus de ton dernier post :

tu fait un tableau :
Toto
Remi
Paul
Jean
Catherine
Dorothée
Bob

tu le mélange avec array_shuffle()
Bob
Paul
Dorothée
Remi
Jean
Toto
Catherine

Et tu lit le premier du tableau pour le 1er tours.
'BOB is winner'

Ou tu fait un tableau de "n" occurrences ici n = 7
Toto
Remi
Paul
Jean
Catherine
Dorothée
Bob

Tu fait un rand() entre '0' et 'n' et tu lit et supprime l’occurrence qui correspond :
'BOB is winner'

ton tableau devient :
Toto
Remi
Paul
Jean
Catherine
Dorothée

Cordialement.

Re: Tirage au sort MAIS sans doublons ...

par antoine02100 » 27 juil. 2012, 10:49

Pour répondre à vos quesion, il me semble que ma demande n'est pas compliquée ...
mais vu mon niveau, pas totalement facile à régler.

A l'heure d'aujourd'hui, le script fonctionne ...
https://www.lepetitsaintquentinois.fr/tirage.php

Cependant, il y a des doublons. Je pensais faire un système avec une varaible dynamique,
mais je n'y arrive pas. Je m'explique.

Premier tirage ... au choix parmis les Y participants au jeux.
Je stock dans une variable dynamique GAGNANT[1] la valeur du numéro du joueur : ex : 32.

Au deuxième tour, je tire au sort parmis les Y participants,
et je vérifie que le numéro du joueurs gagnant, 25 par exemple, n'est pas présent
dans le tableau de la variable dynamique, sinon, je retire au sort, et je fais à nouveau la vérification.
Une fois un nouveau gagnant trouvé, je passe au tirage du gagnant suivant,

Au troisième tour, je tire au sort parmis les Y participants,
et je vérifie que le numéro du joueurs gagnant, 14 par exemple, n'est pas présent
dans le tableau de la variable dynamique, sinon, je retire au sort, et je fais à nouveau la vérification.
Une fois un nouveau gagnant trouvé, je passe au tirage du gagnant suivant,
Etc ...

Suis-je clair ?

Re: Tirage au sort MAIS sans doublons ...

par Ryle » 27 juil. 2012, 10:26

Le plus simple pour un tirage au sort sans doublon, c'est de constituer un tableau de valeurs (donc un tableau de joueurs) et à chaque fois que l'un des joueurs est tiré au sort, le supprimer du tableau. Ainsi ton tableau se réduit au fur et à mesure afin de ne comporter que les joueurs qui n'ont encore rien gagné :)

Autre solution, une fois ton tableau constitué tu peux utiliser la fonction array_shuffle pour le mélanger et tu n'auras alors qu'à lire les X premiers résultats pour avoir X gagnants différents sans t'embêter à faire de random :)

Re: Tirage au sort MAIS sans doublons ...

par Zahnzao » 27 juil. 2012, 10:25

Salut, quel resultat attends tu et quel resultat obtiens tu ?

Si tu pouvais aussi éditer ton post pour ajouter la balise PHP ca serai plus clair ;)

Tirage au sort MAIS sans doublons ...

par antoine02100 » 27 juil. 2012, 09:41

Bonjour à tous,

Voilà j'ai un problème. Je veux faire un petit programme pour tirer au sort,
X gagnants dans une liste de Y participants ... ayant X cadeaux à faire gagner.

Mon programme fonctionne, mais je n'arrive pas à régler le problème
des doublons ...

De plus, mon programme peut être simplifier je suppose.
Merci de vos conseils éclairés.

Antoine


Voici mon fichier : tirage.php

Code : Tout sélectionner

<html> <body> <form method="post" action="verif.php"> Nombre de joueurs : <input type="text" name="joueurs" size="5"> Nombre de cadeaux : <input type="text" name="cadeaux" size="5"> <input type="submit" value="OK"> </form> </body> </html>
Voici mon fichier verif.php

Code : Tout sélectionner

<?php $joueurs = $_POST['joueurs']; $cadeaux = $_POST['cadeaux']; $cadeaux = $cadeaux+1; ?> <html> <body> <? for($i=1; $i != $cadeaux ; $i++) { $ind = $i; $gagnant = mt_rand(1,$joueurs); ${resultat.$i} = $gagnant; for($i=1; $i == $ind ; $i++) { if { ${resultat.$i} != $gagnant; } Else { echo "Gagnant N°"; echo "$i "; echo ": "; echo $gagnant; echo "<br />"; } ${resultat.$i} == $gagnant; $gagnant = mt_rand(1,$joueurs); } else { ${resultat.$i} != $gagnant; echo "Gagnant N°"; echo "$i "; echo ": "; echo $gagnant; echo "<br />"; } } ?> </body> </html>