1

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

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

(3215-5)/5 = 642所以获胜的几率是 642 比 1 - 对吗?(我数学很烂)

在我的表中,它包含数据库中的 3215 行,我会像这样选择一个随机行吗?

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

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

4

5 回答 5

6

这是正确的。五个人可以中奖,有 3215 名参赛者,因此中奖的几率是 3215 ÷ 5,即 643 中的 1,即 642 比 1。每 643 场胜利中有 1 场胜利意味着每 1 场胜利者中有 642 场失败者。请注意“x in y chance”与“x-to-y chance”之间的细微一次性差异。

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

于 2009-11-01T18:36:07.527 回答
2

为什么不使用LIMIT 5一步来选择获胜者呢?

于 2009-11-01T18:36:43.247 回答
2

中奖几率为总参赛者/奖品

没有必要减少奖品的数量。例如,如果我们有 2 名参赛者和一个奖品,则赔率为 2/1,这意味着每个参赛者都有两次获胜机会之一(如果我们减少奖品数量,则为 1/1,这意味着一对一的机会 - 当然赢...)

查询似乎是正确的:

  • 同一参赛者不会被选中两次(假设您有更新“获胜”字段的代码)
  • 用户将被随机选择,每次查询时都会产生不同的顺序
于 2009-11-01T18:39:37.407 回答
1

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

于 2009-11-01T18:36:55.900 回答
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并不理想,因为它不能确保一个人只会赢一次,除非您假设一个人只输入一次(不太可能)。

于 2009-11-01T18:50:57.340 回答