Generar un ganador al azar y mostrar las probabilidades de ganar - estoy haciendo bien?

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

  •  11-09-2019
  •  | 
  •  

Pregunta

Estoy corriendo un concurso en un sitio web y tengo 3215 participantes que son elegibles para 5x Sony PSP.

Creo que la fórmula para calcular las probabilidades es totalEntrants - premios / premios:

(3215-5)/5 = 642 así que eso es una odds de 642 a 1 de ganar - es así? (Soy muy malo en matemáticas)

Y en mi mesa, que contiene 3215 filas en la base de datos me acaba de seleccionar una fila al azar, como así?

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

Ahora tengo una fila, y tengo que configurar la columna de la won a 1 por lo que el participante no puede ganar de nuevo, a continuación, ejecute de nuevo? Esta es mi primera vez haciendo así que sólo quiero confirmación de si lo estoy haciendo correctamente.

¿Fue útil?

Solución

Eso es correcto. Cinco personas pueden ganar, hay 3215 participantes, por lo que las probabilidades de ganar son 3215 ÷ 5, que es de 1 en 643 o 642-a-1. 1 de cada 643 victorias que significa que hay 642 perdedores a cada 1 ganador. Tenga en cuenta la sutil diferencia de una sola vez entre "x en y oportunidad" frente a "x-a-y oportunidad".

Su método de selección se ve bien. También se puede seleccionar todos a la vez cambiándola a LIMIT 5.

Otros consejos

¿Por qué no usar LIMIT 5 para seleccionar a los ganadores en un solo paso?

probabilidades de ganar son totalEntrants / premios

No hay necesidad de reducir el número de premios. por ejemplo, si tenemos 2 participantes y un premio las probabilidades son 2/1, es decir, cada participante tiene una de dos posibilidades de ganar (si nos gustaría reducir el número de premios que es ser 1/1, es decir, uno a uno la oportunidad - Seguro ganar ...)

La consulta parece correcto:

  • El mismo participante no conseguirá seleccionado dos veces (Suponiendo que tiene código que las actualizaciones 'ganado' campo)
  • El usuario será seleccionado al azar por RANDOM generar orden diferente cada vez consultar

Creo que no se puede seleccionar y actualizar en la misma consulta. Lo que quiero hacer es usar su consulta para seleccionar un ganador al azar y ejecutar una actualización en el registro cuya identificación fue vuelto a cambiar el campo "ganado" a tener un valor 1. A continuación, sólo tiene que repetir el proceso 4 veces. :)

Uso:

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;

También es posible usar:

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

... pero no hay ninguna diferencia en el rendimiento - ver: NO EN vs NO EXISTE vs LEFT JOIN / IS NULL: MySQL

Actualizar . Usando LIMIT 5 no es ideal, ya que no asegura que una persona va a ganar sólo una vez, a menos que se supone que una persona entró una vez (poco probable) solamente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top