توليد فائز عشوائي وعرض احتمالات الفوز - هل أفعل هذا صحيحا؟

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

  •  11-09-2019
  •  | 
  •  

سؤال

أقوم بتشغيل مسابقة على موقع ويب ولدي 3215 مشاركا مؤهلين للحصول على 5x Sony PSPs.

أعتقد أن الصيغة لحساب الاحتمالات هي العواصف - الجوائز / الجوائز:

(3215-5)/5 = 642 بحيث تكون احتمالات 642 إلى 1 من الفوز - هل هذا صحيح؟ (أنا تمتص في الرياضيات)

وفي طاولتي التي تحتوي على 3215 صفوفا في قاعدة البيانات، أود فقط تحديد صف عشوائي مثل؟

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

الآن لدي صف واحد، وأنا بحاجة إلى ضبط won عمود إلى 1 لذلك لا يستطيع المشارك الفوز مرة أخرى، ثم قم بتشغيله مرة أخرى؟ هذه هي المرة الأولى التي أفعلها حتى الآن أريد التأكيد على ما إذا كنت أفعل ذلك بشكل صحيح.

هل كانت مفيدة؟

المحلول

هذا صحيح. يمكن لخمسة أشخاص الفوز، وهناك 3215 مشاركين، وبالتالي فإن احتمالات الفوز 3215 ÷ 5 والذي هو 1 في 643، أو 642 إلى 1. 1 في كل 643 WINS معنى هناك 642 خاسرين لكل فائز كل واحد. لاحظ الفرق الواحد الدقيق بين فرصة "X في y" مقابل فرصة "x-to-y".

طريقة الاختيار الخاصة بك تبدو جيدة. يمكنك أيضا تحديدها جميعا في وقت واحد عن طريق تغييرها إلى LIMIT 5.

نصائح أخرى

لماذا لا تستخدم فقط LIMIT 5 لتحديد الفائزين في خطوة واحدة؟

احتمالات الفوز العواصف / الجوائز

ليست هناك حاجة للحد من عدد الجوائز. على سبيل المثال، إذا كان لدينا 2 الداخلين وجائزة واحدة من الاحتمالات هي 2/1، مما يعني أن كل مشارك لديه فرصين للفوز (إذا قمنا بتقليل عدد الجوائز سيكون 1/1، بمعنى فرصة واحدة إلى فرصة واحدة - بالتأكيد يفوز...)

يبدو الاستعلام صحيحا:

  • لن يتم تحديد نفس المشارك مرتين (على افتراض أن لديك رمز يقوم بتحديث 'وون' حقل)
  • سيتم تحديد المستخدم بشكل عشوائي عن طريق توليد ترتيب مختلف في كل مرة الاستعلام

أعتقد أنك لا تستطيع تحديد وتحديث في نفس الاستعلام. ما سأفعله هو استخدام استعلامك لتحديد فائز عشوائي وتنفيذ تحديثا على السجل الذي تم إرجاع معرف معرفه لتغيير الحقل "WON" للحصول على قيمة 1. ثم كرر العملية 4 مرات. :)

يستخدم:

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;

... ولكن ليس هناك فرق في الأداء - انظر: ليس في مقابل عدم وجود مقابل اليسار الانضمام / لاغيا: mysql

تحديث: استخدام LIMIT 5 ليس مثاليا لأنه لا يضمن أن يفوز الشخص مرة واحدة فقط، إلا إذا افترضت أن الشخص الذي تم إدخاله مرة واحدة فقط (من غير المرجح).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top