Création d'un gagnant au hasard et d'afficher les chances de gagner - ce que je fais ce droit?

StackOverflow https://stackoverflow.com/questions/1657893

  •  11-09-2019
  •  | 
  •  

Question

Je suis en cours d'exécution d'un concours sur un site Web et je 3215 participants qui sont admissibles à 5x Sony PSP.

Je crois que la formule pour compter les cotes est totalEntrants - prix / prix:

(3215-5)/5 = 642 donc c'est une chance de 642-1 de gagner - est-ce pas? (Je suce en maths)

Et dans ma table qui contient 3215 lignes dans la base de données, je voudrais juste sélectionner une ligne au hasard comme ça?

SELECT * from entries
WHERE entries.won = 0
ORDER BY RAND()
LIMIT 1

Maintenant, j'ai une ligne, et je dois mettre la colonne won à 1 si le participant ne peut pas gagner à nouveau, puis exécutez à nouveau? Ceci est ma première fois faire si je veux juste confirmation si je le fais correctement.

Était-ce utile?

La solution

C'est vrai. Cinq personnes peuvent gagner, il y a 3215 participants, de sorte que les chances de gagner sont 3215 ÷ 5 qui est de 1 à 643, ou 642 à 1. 1 dans tous les 643 victoires qui signifie il y a 642 perdants à tous les 1 gagnant. Notez la différence subtile unique entre « x au hasard y » par rapport à « x à y hasard ».

Votre méthode de sélection a l'air bien. Vous pouvez aussi les sélectionner à la fois en changeant à LIMIT 5.

Autres conseils

Pourquoi ne pas simplement utiliser LIMIT 5 pour sélectionner les gagnants en une seule étape?

chance de gain est totalEntrants / prix

Il n'y a pas besoin de réduire le nombre de prix. par exemple, si nous avons 2 participants et un prix sont les chances 2/1, qui signifie que chaque participant a l'une des deux chances de gagner (si nous avions réduit le nombre de prix qu'il va être 1/1, ce qui signifie une à une chance - vous gagner ...)

La requête semble droite:

  • participant même ne sera pas sélectionné deux fois (En supposant que vous avez du code qui met à jour 'gagné' champ)
  • L'utilisateur sera choisi au hasard par RANDOM générer un ordre différent à chaque fois que l'interrogation

Je pense que vous ne pouvez pas sélectionner et mettre à jour dans la même requête. Ce que je voudrais faire est d'utiliser votre requête pour sélectionner un gagnant au hasard et d'exécuter une mise à jour sur le registre dont l'ID a été retourné pour modifier le champ « gagné » d'avoir la valeur 1. Ensuite, vous répéter le processus 4 fois. :)

Utilisation:

CREATE TEMPORARY TABLE won LIKE ENTRIES;

DECLARE numAwards INT DEFAULT 5;

WHILE numAwards > 0 DO

  INSERT INTO won
    (columns...)
    SELECT e.*
      FROM ENTRIES e
     WHERE e.userid NOT IN (SELECT w.userid FROM won)
  ORDER BY RAND()
     LIMIT 1;

  SET numAwards = numAwards - 1;

END WHILE;

Vous pouvez également utiliser:

   SELECT e.*
     FROM ENTRIES e
LEFT JOIN won w ON w.userid = e.userid
    WHERE w.userid IS NULL
  ORDER BY RAND()
     LIMIT 1;

... mais il n'y a pas de différence dans la performance - voir: pas vs. pas EXISTE contre LEFT JOIN / IS nULL: MySQL

UPDATE :. L'utilisation LIMIT 5 n'est pas idéale, car elle ne garantit pas qu'une personne gagnera une seule fois, à moins que vous assumez qu'une seule personne est entré une fois (peu probable)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top