生成一个随机的赢家并显示获胜的几率 - 我这样做了吗?

时间:2009-11-01 18:30:44

标签: sql math probability

我正在网站上举办比赛,我有3215名参赛者有资格获得5x索尼PSP。

我相信计算赔率的公式是totalEntrants - 奖品/奖品:

(3215-5)/5 = 642所以获胜的赔率为642比1 - 是吗? (我吮吸数学)

在我的数据库中包含3215行的表中,我只选择一个随机行?

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

现在我有一行,我需要将won列设置为1,这样参赛者才能再次获胜,然后再次运行?这是我第一次这样做,所以我只想确认我是否正确地做了。

5 个答案:

答案 0 :(得分:6)

没错。五人可以获胜,有3215名参赛者,因此获胜的几率是3215÷5,即643中的1,或者是642比1。每643个赢1个意味着每1个赢家有642个输家。请注意“x in y chance”与“x-to-y chance”之间微妙的一次性差异。

您的选择方法看起来很好。您也可以通过将其更改为LIMIT 5来一次性选择它们。

答案 1 :(得分:2)

为什么不使用LIMIT 5一步选择获奖者?

答案 2 :(得分:2)

获胜赔率 totalEntrants / prizes

无需减少奖品数量。例如,如果我们有2个参赛者和一个奖品,赔率为2/1,这意味着每个参赛者都有两个获胜机会中的一个(如果我们减少奖金数量是1/1,这意味着一对一的机会 - 确保赢...)

查询似乎正确:

  • 相同的参赛者不会被选中两次 (假设您有更新的代码 '赢'字段)
  • 每次查询时,RANDOM会随机选择用户生成不同的顺序

答案 3 :(得分:1)

我认为你不能在同一个查询中选择和更新。我要做的是使用您的查询选择一个随机赢家,并在返回ID的寄存器上执行更新,将“赢”字段更改为值1.然后您只需重复该过程4次。 :)

答案 4 :(得分:1)

使用:

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;

你也可以使用:

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

...但性能没有差异 - 请参阅:NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL

更新:使用LIMIT 5并不理想,因为它不能确保一个人只赢一次,除非您假设一个人只输入一次(不太可能)。