עריכה: בדקתי ואכן היה הבדלים סטטיסטים בין אופן ביצוע ההגרלה, למרות ששניהם השתמשו באותה שיטה, אבל התוכנה שלי הוסיפה בסוף ערבוב נוסף מיותר שמטמטית היתה פחות טובה.התאמתי את התוכנה שלי כך שתתאים לאותה שיטה.
למי שמתענין על ההבדלים בשיטות ההגרלה שהיו, סקירה בספויילר
Spoiler
להלן סקירה בספויילר של AI על אופי 2 התוכנות. התוכנה שלי נקראת "לשכת" [ולא לשכת "הרב" אחרת זה היה מצונזר בנטפרי..] והשני זה "מים אחרונים"
שתי המערכות אכן מיועדות לבחירה אקראית של משתתפים, אך הן פועלות בצורות שונות מאחורי הקלעים (ברמת קוד ה-JavaScript). הנה פירוט של ההבדלים בשיטת הפעולה ורמת האמינות המקצועית שלהן:
שיטת ההגרלה במערכת "לשכת" (לשכת.html):
מערכת זו משתמשת בתהליך מורכב המורכב ממספר שלבים כדי לערבב את הרשימה.
בעת ביצוע ההגרלה, המערכת מבצעת 10 סבבים רצופים של ערבוב הרשימה באמצעות לולאה המחליפה את המיקומים של המשתתפים (שיטה המזכירה את אלגוריתם Fisher-Yates).
לאחר סיום 10 הסבבים, היא מבצעת שלב נוסף של מיון אקראי על ידי הפונקציה sort(() => 0.5 - Math.random()).
לבסוף, היא "חותכת" מתוך הרשימה המעורבבת את כמות הזוכים שהוגדרה על ידי המשתמש ומציגה אותם.
שיטת ההגרלה במערכת "מים אחרונים" (מים אחרונים.html):
מערכת זו משתמשת בגישה ישירה, פשוטה וממוקדת יותר.
במקום לערבב את כל הרשימה מראש, המערכת ניגשת ישירות למערך השמות ומגרילה מספר אקראי (אינדקס) מ-0 ועד למספר המשתתפים הכולל ברשימה, באמצעות הפקודה Math.floor(Math.random() * names.length).
השם שנמצא במיקום שעלה בגורל נבחר ישירות ומוכרז כזוכה.
מה ההבדל באמינות ואיזו שיטה עדיפה מקצועית?
שתי המערכות מסתמכות בסופו של דבר על אותו מנוע ליצירת מספרים אקראיים הקיים בדפדפן (Math.random()), אך אופן השימוש בו משפיע על הדיוק הסטטיסטי:
מבחינה אלגוריתמית טהורה: השיטה של "מים אחרונים" נחשבת לאמינה ומדויקת יותר לבחירת זוכה יחיד. שליפת אינדקס אחד אקראי היא הדרך התקנית והמומלצת בעולם התכנות, שכן היא מעניקה סיכוי שווה לחלוטין לכל משתתף ומונעת הטיות.
הבעיה בשיטת "לשכת": למרות שהיא נראית "מושקעת" יותר עם ערבוב כפול, השימוש בפונקציה sort יחד עם Math.random() (כפי שנעשה בשלב האחרון שלה) נחשב בעולם הפיתוח לפרקטיקה פחות מומלצת. הסיבה לכך היא שמנועי מיון בדפדפנים לא מתוכננים לעבוד עם ערכים אקראיים, מה שעלול ליצור פיזור לא שוויוני לחלוטין של התוצאות (חלק מהמשתתפים עלולים לקבל סיכוי מעט גבוה יותר מאחרים להישאר בראש הרשימה).
היתרון של "לשכת": היתרון המובהק שלה הוא היכולת התפעולית להגריל מספר זוכים בו-זמנית בקלות, בעוד ש"מים אחרונים" מתוכננת לשלוף רק זוכה אחד בכל לחיצה.
לסיכום, אם המטרה היא להגריל זוכה אחד בלבד – אלגוריתם הבחירה של "מים אחרונים" נכון יותר סטטיסטית. אם יש צורך בהגרלה של מספר זוכים במקביל או בניהול היסטוריה מתקדם, הקוד של "לשכת" יעשה את העבודה, והסטייה הסטטיסטית הקלה בו היא לרוב זניחה לשימושים יומיומיים רגילים.
עריכה: כעת התוכנה של "לשכת" הותאמה ושודרגה כך שכעת הם פועלים בשיטה תואמת
Spoiler
אגב, אם יש ענין לראות איך התוכנה עובדת, כתבו ואני יעלה גיפ