1

Web サイトでコンテストを開催しており、5 倍の Sony PSP を受け取る資格のある 3215 人の参加者がいます。

オッズを計算する式は、totalEntrants - 賞品 / 賞品:

(3215-5)/5 = 642つまり、642 対 1 の確率で勝つということです。そうですか? (私は数学が苦手です)

そして、データベースに3215行を含む私のテーブルでは、そのようにランダムな行を選択するだけですか?

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

これで行が 1 つになりました。参加者が再び勝てないようにwon列を設定してから、もう一度実行する必要がありますか? 1これは初めてのことなので、正しく行っているかどうかを確認したいだけです。

4

5 に答える 5

6

それは正しい。5人が勝つことができます。3215人の参加者がいるので、勝つ確率は3215÷5で、643人に1人、つまり642対1です。643勝ごとに1つは、勝者1人ごとに642人の敗者がいることを意味します。「xinyチャンス」と「x-to-yチャンス」の微妙な1回限りの違いに注意してください。

選択方法は問題ないようです。に変更して、一度にすべてを選択することもできますLIMIT 5

于 2009-11-01T18:36:07.527 に答える
2

LIMIT 5ワンステップで勝者を選ぶためだけに使ってみませんか?

于 2009-11-01T18:36:43.247 に答える
2

勝率はtotalEntrants/賞品です

賞品の数を減らす必要はありません。たとえば、2人の参加者がいて、1つの賞品がある場合、オッズは2/1です。つまり、各参加者は2つのチャンスのうちの1つを獲得できます(賞品の数を減らすと、1/1になり、1対1のチャンスになります-確かに勝つ...)

クエリは正しいようです:

  • 同じ参加者が2回選択されることはありません(「ウォン」フィールドを更新するコードがあると仮定します)
  • ユーザーはランダムにランダムに選択され、クエリを実行するたびに異なる順序が生成されます
于 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人が1回だけ入力したと仮定しない限り(可能性は低い)、人が1回だけ勝つことを保証しないため、使用は理想的ではありません。

于 2009-11-01T18:50:57.340 に答える