سؤال

أقوم بتنفيذ اختيار عجلة الروليت، وأود أن أبقي أكبر عدد ممكن من التعليمات البرمجية في SQL. أسفرت محاولتي عن الاستعلام أدناه. $ 1 هو متغير عشوائي من نفس النطاق مثل الوزن الذي أرسلته إلى رمز SQL (لم يكن من الواضح كيفية صنع عشوائي () يسمى مرة واحدة فقط). الوزن هو حجم فتحة الصف على العجلة. عشوائي () هي وظيفة SQLite التي ترجع رقم عشوائي. هنا هو الاستعلام بالكامل:

SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1

سؤالي هو، هل هذه لا تزال عجلة الروليت؟ ستحتاج الخوارزمية الأساسية إلى تجميل جميع الأوزان، ثم اختيار قيمة عشوائية للنطاق 0..SUM - هذا سيحدد الصف الذي تم تحديده. بدلا من ذلك، يقوم هذا الروتين أولا بتصفية جميع الصفوف التي تلبي رقم واحد عشوائي، ثم يتسكع ترتيبها ويقتلق الأول.

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

لذلك، أعتقد أنني أسأل كم هذه عجلة الروليت المرآة هذه، لأنه من الواضح أنه يتبع خطوات مختلفة. ولكن هل تعكس النتائج؟

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

المحلول

شيء واحد قد فكرت فيه فقط هو أن هذه ليست عجلة الروليت بسبب هذا الدليل البسيط حسب المثال:

إذا كان لديك ثلاثة عناصر، واحدة من كل وزن واحد، اثنان وثلاث، ثم عجلة الروليت تختارها مع 1/6، 2 / 6ths و 3 / 6ths احتمال. ومع ذلك، فإن روتينتي سوف تحيز الأوزان العليا:

Filter, A  ,   B,   C
  1   , 1/3, 1/3, 1/3
  2   , 0  , 1/2, 1/2
  3   , 0  , 0  , 1

أعلاه يمكنك أن ترى ذلك لكل قيم filter ($1 في السؤال)، البنود A, B, ، و C تظهر مع فرص اختيار كل منها. إضافة كل هذا الأمر من شأنه أن يعطي الاحتمالات مجتمعة A, B و C ليكون 2 / 18ths، 5 / 18ths و 11 / 18ths.

هذا يختلف عن عجلة الروليت، ويبدو أن الاستعلام في السؤال هو التحيز الأوزان أكبر. حتى الإجابة على سؤالي الخاص، يعكس الاستعلام عجلة الروليت، ولكن لا يتطابق معها.

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

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