لقد قدمنا هدية صغيرة لإطلاق Toolz، وقمت بالرسم بطريقة كسولة: لقد قمت بلصق قائمة المشاركين في جدول بيانات، وأضفت عمودًا من =RAND()، وفرز حسب ذلك. لقد نجح الأمر، لكن صديقًا يقوم بإحصائيات لقمة العيش نظر من فوق كتفي وقال، "؛ أنت تعلم أن هذا ليس موحدًا في الواقع، أليس كذلك؟"؛ لقد كان على حق، وجحر الأرنب الذي سقطت فيه في ذلك المساء هو جزء كبير من سبب حصول تولز الآن على مكان مناسب قائمة العشوائية هذا يفعل الخلط بالطريقة الصحيحة. هذا الدليل هو ما تعلمته، وهو مكتوب لأي شخص يحتاج إلى سحب الأسماء من القبعة ويريد أن تكون القبعة صادقة.
ليرة تركية؛DR: يقوم أداة التوزيع العشوائي للقائمة إما بإعادة ترتيب قائمة كاملة بشكل عشوائي (خلط عشوائي) أو سحب عينة عشوائية منها (اختيار). يستخدم الجيدون خلط فيشر ييتس ومصدرًا عشوائيًا للتشفير بحيث يكون كل طلب متساويًا في الاحتمال. استخدم خلط ورق اللعب لترتيب الأدوار والجلوس، واختر الهدايا والعينات. تعمل هذه الأداة من جانب العميل، ويتم رسمها دون استبدال افتراضيًا بحيث يكون الفائزون فريدين، وترفض رسم عناصر فريدة أكثر مما تحمله القائمة.
أقوم ببناء منتجات SaaS على Laravel وReact، لذلك أهتم بأمرين هنا: إجراء العمليات الحسابية بشكل صحيح، وجعل الواجهة واضحة بدرجة كافية بحيث لا تتساءل أبدًا عما إذا كان السحب عادلاً. كلاهما مهم أكثر مما يبدو.
ما هو العشوائية القائمة؟
يأخذ الموزع العشوائي للقائمة قائمة من العناصر، واحدة في كل سطر، ويعيد ترتيبها أو أخذ عينات منها بشكل عشوائي. الخلط العادل هو مشكلة تم حلها بإجابة خاطئة تبدو صحيحة: الفرز بواسطة مفتاح عشوائي متحيز، في حين أن خلط فيشر ييتس ليس كذلك، ويقوم المتصفح بتزويد البتات غير المتحيزة من خلاله crypto.getRandomValues(). الصق الأسماء أو الجوائز أو المهام أو الفرق أو الأفكار، وإما أن يعيد القائمة بأكملها بترتيب مختلط أو يختار عدد الفائزين الذين طلبتهم. إنها النسخة البرمجية لرسم القصاصات المطوية من الوعاء، مع ميزة أنها تزيل التحيز الهادئ الذي يقدمه البشر عندما يحاولون الاختيار والاقتباس؛ عشوائيًا واقتباس؛ باليد.
هناك في الواقع عمليتان فقط، ومعرفة أيهما تريد هي المهارة بأكملها. يقوم Shuffle بإرجاع كل عنصر قدمته له، فقط بترتيب عشوائي جديد، لذلك لا تتم إضافة أو فقدان أي شيء. يقوم Pick بإرجاع مجموعة فرعية، وسحب عدد محدد من العناصر من المجموعة. السحب هو اختيار. تحديد من يقدم أولاً في وضع الوقوف هو خلط ورق اللعب. يصل معظم الأشخاص إلى الشخص الخطأ مرة واحدة على الأقل، وعادةً ما يحاولون "؛ خلط ورق اللعب وأخذ الثلاثة الأوائل؛ عندما يقوم Pick بعدد ثلاثة بنفس الشيء في خطوة واحدة.
كيف يعمل الخلط العادل فعليا؟
هذا هو الجزء الذي كان صديقي الإحصائي يحصل عليه. تبدو خدعة جدول البيانات، التي يتم فيها تعيين رقم عشوائي لكل صف وفرز، عشوائية ولكنها ليست موحدة. تقوم خوارزميات الفرز بإجراء مقارنات، وعندما يكون مفتاحان عشوائيان قريبين، تتسرب التحيزات الصغيرة في كيفية حل الروابط والمقارنات إلى النتيجة. في القوائم الصغيرة، يكون الانحراف صغيرًا، ولكنه حقيقي، وبالنسبة لأي شيء تكون فيه العدالة هي النقطة، "؛ قريب بما فيه الكفاية وحاصل؛ ليست إجابة رائعة.
الطريقة الصحيحة هي خلط فيشر ييتس، والذي يُطلق عليه أحيانًا خلط كنوث بعد أن قام دونالد كنوث بنشر الإصدار الموجود في المكان. تم وصفه من قبل رونالد فيشر وفرانك ييتس في عام 1938 وأعطي شكل الكمبيوتر الحديث الخاص به بواسطة ريتشارد دورستنفيلد في عام 1964. الفكرة بسيطة. قم بتمرير القائمة من العنصر الأخير إلى العنصر الثاني. في كل موضع، اختر فهرسًا عشوائيًا من بداية القائمة حتى الموضع الحالي بما في ذلك، ثم قم بتبديل العنصرين. نظرًا لأن كل مبادلة مستمدة من نطاق متقلص ومحدد جيدًا، فإن كل ترتيب من الترتيبات المحتملة يخرج باحتمالية متساوية تمامًا. يعمل في وقت خطي، ويلامس كل عنصر مرة واحدة، ولا يحتاج إلى ذاكرة إضافية خارج القائمة نفسها.
ال قائمة العشوائية يستخدم هذه الخوارزمية مباشرة. عند الاختيار بدون استبدال، يتم إيقاف الخلط نفسه مبكرًا: قم بخلط القائمة، ثم خذ العناصر N الأولى. وهذا يضمن أن الفائزين متميزون وأن كل مجموعة محتملة من الفائزين متساوية في الاحتمال.
من أين تأتي العشوائية؟
الخوارزمية عادلة فقط مثل الأرقام العشوائية التي تغذيها. إذا كان مصدر العشوائية متوقعًا أو متحيزًا، فإن الخلط المثالي لا يزال ينتج نتيجة منحرفة. هذا هو المكان الذي يكسب فيه المتصفح الاحتفاظ به.
المتصفحات الحديثة تكشف crypto.getRandomValues، جزء من W3C Web Cryptography API، الذي يملأ مصفوفة بقيم عشوائية قوية تشفيرًا مستمدة من تجمع الإنتروبيا لنظام التشغيل. وهذا مصدر أقوى بكثير من Math.random، وهو مولد عشوائي زائف سريع لم يكن مخصصًا أبدًا لأي شيء تكون فيه القدرة على التنبؤ مهمة. يفضل الموزع العشوائي crypto.getRandomValues ولا يعود إلا إلى Math.random عندما يكون مصدر العملات المشفرة غير متاح حقًا، وهو ما لا يكون متاحًا أبدًا في المتصفح الحالي.
هناك نوع آخر من الدقة كان علي أن أحصل عليه بشكل صحيح. لتحويل رقم عشوائي مكون من 32 بت إلى فهرس غير متحيز من 0 إلى N ناقص 1، لا يمكنك فقط أخذ الباقي بعد القسمة على N، لأنه ما لم يتم تقسيم N بالتساوي إلى النطاق، فإن المؤشرات المنخفضة تظهر في كثير من الأحيان قليلاً. الإصلاح هو أخذ عينات الرفض: حساب أكبر مضاعف لـ N يناسب النطاق، وإذا وصل السحب فوق هذا القطع، قم برميها بعيدًا واسحبها مرة أخرى. إنها تكلف عددًا ضئيلًا من السحوبات الإضافية وتزيل التحيز تمامًا. تقوم الأداة بذلك على كل فهرس تختاره، وهو نوع التفاصيل التي لا يلاحظها أحد حتى يتم فقدها.
كيف يمكنني استخدام الموزع العشوائي؟
تحتوي الواجهة على زر واحد واثنين من الخيارات. وإليك كيفية تشغيله.
الصق قائمتك في مربع الإدخال، عنصر واحد في كل سطر. إذا قمت بنسخ خلية مفصولة بفواصل من جدول بيانات، فقم بتبديل فاصل الإدخال إلى فاصلة وسوف ينقسم على الفواصل بدلاً من ذلك. يتم تشغيل سلوك القطع والإفلات بشكل افتراضي، لذلك لا تصبح الخطوط الفارغة الضالة والمسافات البادئة العرضية إدخالات وهمية.
اختر وضعك. خلط ورق اللعب يعيد ترتيب كل شيء. اختر يرسم الفائزين. إذا اخترت اختيار، تظهر لوحة صغيرة حيث تقوم بتعيين عدد مرات الرسم وما إذا كان مسموحًا بالتكرار. اترك التكرارات للحصول على هدية بحيث يكون كل فائز شخصًا مختلفًا. يتم تشغيل التشغيل فقط عندما تريد بالفعل أخذ العينات مع الاستبدال، على سبيل المثال عندما تقوم بمحاكاة عمليات السحب الشبيهة بالنرد ويمكن تكرار نفس القيمة بشكل شرعي.
انقر على عشوائية. تحصل على نتيجة جديدة ومستقلة في كل مرة، لذا إذا كنت تريد إعادة الرسم فما عليك سوى النقر مرة أخرى. انسخ الإخراج بنقرة واحدة للصقه في إعلانك أو تذكرتك أو في أي مكان تحتاج فيه النتيجة إلى العيش. إذا طلبت فائزين فريدين أكثر مما يمكن أن توفره القائمة، فستخبرك الأداة بدلاً من إرجاع قائمة قصيرة أو متكررة بهدوء، وهو خطأ رأيت أدوات أخرى ترتكبه.
من الناحية العملية، القوائم التي ألصقها موجودة في جميع أنحاء الخريطة. في بعض الأيام يكون عمودًا من رسائل البريد الإلكتروني للعملاء لسحب الجائزة، وفي أيام أخرى تكون الأسماء الموجودة في فريقي لمن يراجع طلب السحب التالي، وبمجرد أن يكون كل مطعم على مسافة قريبة لأنه لا يمكن لأحد أن يقرر تناول الغداء. الأداة لا تهتم بماهية العناصر، فقط أنها منفصلة بشكل نظيف. ولهذا السبب تستحق خيارات الإدخال ثانية من الاهتمام: إذا كان مصدرك عبارة عن خلية جدول بيانات، فإن فاصل الفاصلة يحفظك من التحرير اليدوي، وإذا كان نسخًا ولصقًا فوضويًا بصفوف فارغة، فإن الإعداد الافتراضي المسقط الفارغ ينظفه بهدوء قبل السحب. الدقيقة التي تقضيها في تنسيق الإدخال هي دقيقة لا تقضيها في الجدال حول ما إذا كان السطر الفارغ الضال يُحسب كمدخل.
متى يجب أن أخلط، ومتى يجب أن أختار؟
يغطي الوضعان وظائف مختلفة، والجدول أدناه هو ورقة الغش التي كنت أتمنى لو حصلت عليها عندما بدأت.
| تريد... | يستخدم | يكرر | لماذا |
|---|---|---|---|
| قرر التحدث أو تغيير النظام | خلط ورق اللعب | غير متاح | الجميع يبقى في الداخل، النظام عادل |
| ارسم فائزًا واحدًا | اختر، عد 1 | عن | نتيجة فريدة واحدة |
| ارسم العديد من الفائزين بالجوائز | اختر، عد ن | عن | الفائزون المتميزون، لا يوجد غمس مزدوج |
| تعيين الأشخاص لفريقين | خلط ورق اللعب، ثم تقسيم | غير متاح | قم بتقسيم القائمة المختلطة إلى نصفين |
| عينة مع استبدال شريحة sim | اختر، عد ن | على | قد يتكرر نفس العنصر حسب التصميم |
| قم بتوزيع قائمة التشغيل أو قائمة القراءة بشكل عشوائي | خلط ورق اللعب | غير متاح | إعادة الطلب دون إسقاط أي شيء |
القاعدة الأساسية: إذا كان عدد العناصر يجب أن يظل كما هو، قم بالتبديل. إذا كنت تريد عددًا أقل من العناصر مما قمت بوضعه، فاختر. مهمة الفريق هي المهمة التي يفكر فيها الأشخاص أكثر من اللازم. قم بخلط القائمة الكاملة، ثم خذ النصف الأول كفريق A والباقي كفريق B، وكلا الفريقين عشوائيان ومتوازنان في الحجم.
هل من العدل تقديم هبة عامة؟
نعم، والسبب يستحق أن نذكره بوضوح لأن "؛ عادل واقتباس؛ هي القيمة الكاملة للأداة. إن الجمع بين خلط فيشر ييتس ومصدر عشوائي للتشفير وأخذ عينات الرفض يعني أن كل مشارك لديه فرصة متطابقة وأن كل مجموعة محتملة من الفائزين متساوية في الاحتمال. وهذا ضمان أقوى من السحب المادي، حيث يؤدي حجم الانزلاق والطي ومدى خلط الوعاء إلى التحيز.
نظرًا لأن السحب يتم تشغيله بالكامل في متصفحك، فيمكنك القيام بذلك مباشرة على الشاشة أثناء البث أو الاجتماع، وهي الشفافية التي يريدها الأشخاص من السحب العام. لا يتم إرسال أي شيء إلى الخادم، لذلك لا توجد خطوة مخفية حيث يمكن التلاعب بالنتيجة بين نقرتك والإعلان. إذا كنت تريد مسار تدقيق، فقم بتسجيل السحب على الشاشة: قائمة المشاركين مرئية، والنقرة مرئية، وسيظهر الفائزون على الفور.
هل قائمتي خاصة؟
وهذا مهم أكثر مما يبدو لأول مرة، لأن القوائم التي يقوم الأشخاص بتوزيعها بشكل عشوائي غالبًا ما تكون غير عامة. القوائم المختصرة للمرشحين، وأسماء الفرق الداخلية، وإدخالات العملاء، وقوائم البريد الإلكتروني كلها حساسة. يقوم الموزع العشوائي بمعالجة كل شيء محليًا باستخدام JavaScript عادي. لا يتم تحميل قائمتك أو تسجيلها أو تخزينها مطلقًا، ويمكنك تأكيد ذلك في علامة تبويب شبكة المتصفح، حيث يؤدي النقر فوق Randomize إلى عدم إطلاق أي طلب على الإطلاق. كما أنه يستمر في العمل دون اتصال بالإنترنت بمجرد تحميل الصفحة.
هذا موقف متعمد عبر تولز، وقد كتبت عن المنطق في المذكرة الخاصة به خصوصية البيانات في الأدوات عبر الإنترنت. يعد الموزع العشوائي مثالًا جيدًا على سبب أهميته: غالبًا ما يكون الإدخال عبارة عن قائمة بأشخاص حقيقيين، وقائمة الأشخاص الحقيقيين هي بالضبط نوع الشيء الذي لا تريد وضعه في سجل الطلبات على خادم لم تقم بتدقيقه مطلقًا.
بعض العادات التي تجعل السحوبات أكثر نظافة
تنظيف القائمة قبل الرسم. قم بتشغيل إزالة التكرارات إذا ظهر شخص واحد مرتين، لذا فإن الإدخال المزدوج لا يضاعف احتمالاته سرًا. يتم تشغيل إسقاط الأسطر الفارغة بشكل افتراضي، ولكن الأمر يستحق إلقاء نظرة سريعة للتأكد من عدم احتساب السطر الفارغ الزائد.
مطابقة العد مع الجوائز. في وضع الاختيار، قم بتعيين العد على العدد الدقيق للفائزين الذين تحتاجهم واترك التكرارات. إذا كان لديك ثلاث جوائز، اسحب ثلاثًا مرة واحدة بدلاً من النقر على سحب واحد ثلاث مرات، مما يتجنب ظهور الحالة المحرجة التي تحمل الاسم نفسه مرتين عبر نقرات منفصلة.
إعادة الرسم علناً، وليس سراً. إذا كان الفائز غير مؤهل، قم بإزالته وإعادة رسمه أمام من يشاهد. العدالة تأتي من أن تكون العملية مرئية، وليس من أن تكون النتيجة نهائية عند النقرة الأولى.
احتفظ بها في المتصفح. كما هو الحال مع كل أداة أقوم بشحنها، فإن المعالجة المحلية هي الطريقة الافتراضية لأنها أسرع وخاصة. إذا كنت تقوم بتجميع مجموعة شخصية من الأدوات المساعدة الصغيرة، فإن مولد أرقام عشوائية يقترن بشكل طبيعي مع الموزع العشوائي للسحوبات الرقمية، وعلى نطاق أوسع أدوات إنتاجية المطور يشرح Roundup سبب استحقاق إنشاء صندوق أدوات المتصفح أولاً.
الأدوات ذات الصلة تستحق المشاهدة
إذا كان الاختيار العشوائي حاجة متكررة، فإن بعض الجيران يجلسون بالقرب منها. ال مولد أرقام عشوائية يرسم أرقامًا في نطاق بنفس العشوائية من فئة التشفير، وهو ما تريده عندما يكون الشيء الذي تختاره قيمة وليس عنصرًا من القائمة. ال مولد UUID ينتج معرفات فريدة للسجلات وبيانات الاختبار. ال مولد كلمة المرور يطبق نفس المصدر العشوائي القوي لإنتاج كلمات مرور آمنة. تعمل الثلاثة جميعها في المتصفح بدون تسجيل، تمامًا مثل الموزع العشوائي، وأنا أغطي جانب المعرف لتلك العائلة في دليل مولد كلمة المرور.
الأسئلة المتداولة
كيف تعمل القائمة العشوائية؟
تقرأ الأداة قائمتك عنصرًا واحدًا في كل سطر ، ثم تعيد ترتيب كل عنصر أو تجذب الفائزين الذين طلبتهم. تستخدم خلط ورق اللعب خوارزمية فيشر ياتس ، التي تسير في القائمة مرة واحدة وتتبادل كل عنصر بموقع سابق تم اختياره عشوائيًا ، مما ينتج عنه ترتيب عشوائي موحد. تأتي المواضع العشوائية من مولد التشفير للمتصفح ، لذا فإن النتيجة غير متحيزة حقًا.
هل التوزيع العشوائي عادل بالفعل؟
نعم. إنه مستمد من crypto.getRandomValues، المصدر العشوائي للتشفير المدمج في المتصفحات الحديثة، ويستخدم أخذ عينات الرفض بحيث لا يكون هناك فهرس أكثر احتمالاً قليلاً من الآخر. بالاشتراك مع خلط فيشر ييتس، فإن كل ترتيب ممكن لقائمتك له فرصة متساوية، وهو أكثر عدلاً من الخلط اليدوي أو فرز جداول البيانات باستخدام مفتاح عشوائي.
كيف أختار فائزًا عشوائيًا من قائمة الأسماء؟
الصق أسماءك واحدة في كل سطر ، وقم بالتبديل إلى وضع الاختيار ، واضبط العدد على 1 ، وانقر فوق عشوائي. تقوم الأداة بإرجاع اسم عشوائي واحد. لجذب العديد من الفائزين في وقت واحد ، اضبط العدد أعلى واترك التكرارات معطلة بحيث يكون كل فائز فريدًا.
ما الفرق بين المراوغة والاختيار؟
تقوم المراوغة بإرجاع قائمتك بالكامل بترتيب عشوائي جديد ، لذلك لا تتم إضافة أي شيء أو إزالته ، يتم إعادة ترتيبه فقط. Pick يعيد مجموعة فرعية ، ويرسم عدد الفائزين الذين تحددهم من القائمة. استخدم المراوغة لترتيب الأدوار أو المقاعد ، واختيار الهدايا أو العينات أو اختيار عدد قليل من الأشخاص من مجموعة أكبر.
هل يمكن اختيار نفس العنصر أكثر من مرة؟
فقط إذا قمت بتمكين التكرارات. افتراضيًا، يتم رسم وضع الاختيار بدون استبدال، لذا فإن كل فائز هو عنصر مختلف، وهو ما يحتاجه السحب أو الهبة. يسمح تشغيل التكرارات بأخذ العينات مع الاستبدال، حيث يمكن أن يظهر نفس العنصر مرة أخرى، وهو أمر مفيد لعمليات المحاكاة.
لماذا لا يمكنها اختيار عناصر فريدة أكثر من قائمتي؟
بدون تكرار ، يجب أن يكون كل فائز عنصرًا مميزًا ، لذلك لا يمكنك استقطاب عشرة فائزين فريدين من قائمة من ثمانية. عندما يحدث ذلك ، تخبرك الأداة بدلاً من إرجاع نتيجة خاطئة. إما خفض العدد لمطابقة حجم قائمتك أو تمكين التكرارات حتى يمكن إعادة استخدام العناصر.
هل تم تحميل قائمتي على الخادم؟
لا. يتم تشغيل جميع عمليات التحليل والعشوائية محليًا في متصفحك باستخدام JavaScript عادي، ولا يتم نقل أي شيء أو تسجيله أو تخزينه. يمكنك تأكيد ذلك في علامة التبويب "شبكة المتصفح" الخاصة بك، حيث لا يتم تقديم أي طلب عند النقر فوق "عشوائي". كما أنه يعمل دون اتصال بمجرد تحميل الصفحة.
هل يمكنني استخدامه في السحب أو الهبة؟
نعم. الصق المتسابقين واحدًا في كل سطر ، واستخدم وضع الانتقاء مع تعطيل التكرارات ، واضبط العدد على عدد الجوائز. كل نقرة ترسم مجموعة جديدة ومستقلة من الفائزين الفريدين. نظرًا لأن السحب غير متحيز ويحدث من جانب العميل ، يمكنك تشغيله مباشرة على الشاشة للشفافية.



