קוד לביצוע הגרלה. האם הוא תקין?
-
יש לי קוד בסיסי לביצוע הגרלה לבחירת זוכה מרשימת זוכים.
באמצעות הפונקצייה ()random האם באמת יש הזדמנות שווה לכל הפריטים, כי לעיתים נדמה לי שאני רואה יותר מידי תוצאות דומות.let tptalcard = await wixData.query("card").contains("mcil", "הגרלה").isNotEmpty("torem").find() let sac87 = tptalcard.totalCount let mszoch = Math.floor((Math.random() * sac87)); let zoche = await wixData.query("card").contains("mcil", "הגרלה").isNotEmpty("torem").include("save").include("torem").limit(1).skip(mszoch).find() let item = zoche.items[0] console.log(item);
-
@אבי-203 העובדה שאין מיון, לא אומר שהתוצאה ממויין בצורה רנדומלית, זה אומר שמסד הנתונים יכול להחליט למיין איך שהוא שהכי מתאים לו בלי שום התייחסות למה שאתה צריך, הוא יכול למיין תמיד בצורה כזאת שהרשומה שמגיע אחרי
skip(mszoch)
תמיד יהיה משתמש X, לא משנה איזה ערך תשים ל-mzoch
, סתם כי ככה בא לו תמיד לשלוף משתמש X.
(העובדה שהוא יכול לא אומר שזה מה שהוא עושה בפועל, אבל יותר תקין להכריח מיון מסויים כדי להיות בטוח שהוא לא משחק איתך מאחורי גבך) -
@אבי-203 כתב בקוד לביצוע הגרלה. האם הוא תקין?:
אם אפשר רק להבין מדבריך שאין חשש אחר למשל שלא יביא רשומה 0 ? ואת האחרונה?
אני לא חושב שאפשר להבין את זה מדבריי, רק כתבתי מה שתפס את עיניי, אבל גם עכשיו שאתה מעורר את זה, נראה לי שמבחינה הזאת זה תקין
(הרשומה הראשונה יתקבל עבור כל תוצאה שלmath.random
שהוא מתחת ל-1/sac87
(סרסהו ודרשהו, הסדר משובש כי כיוון הקטע מימין לשמאל) והאחרונה עבור תוצאה שמעל ל-1-1/sca87
(כנ"ל)) -
לא מבין מה מפריע ליוסי במיון הפנימי של הDB כשכל המטרה של השאילתה הראשונה זה לקבל את המספר הכולל של הרשומות, ולגבי השניה מה ההבדל אם הוא תוקע מיון לפי א-ב שעדיין זה אקראי לגבי מיקום או שהוא שם מיון אחר.
בעיני (זה אולי רגשי) יותר אקראי לתת לכל אחד מס' אקראי ולמיין ברמת הDB, אבל זה נראה שזה לא אפשרי בwix למיין לפי פונקציה.let zoche = await wixData.query("card") .contains("mcil", "הגרלה") .isNotEmpty("torem") .include("save") .include("torem") .ascending(x => Math.random()) //not supported .limit(1) .find():
-
@dovid כתב בקוד לביצוע הגרלה. האם הוא תקין?:
ולגבי השניה מה ההבדל אם הוא תוקע מיון לפי א-ב שעדיין זה אקראי לגבי מיקום או שהוא שם מיון אחר
אולי אתה צודק. רוב הסיכויים שאתה צודק. אבל יותר תקני להכניס מיון, אחרת ה-DB יכול להחליט להיות רשע ולהביא דוקא משתמש X בכל פעם. (אגב, כאשר יש skip בהחלט יותר קל להתעלם מה-skip כאשר אין מיון וזה עדיין יהיה לפי כל הכללים)
אולי ב-WIX יש מיון ברירת מחדל. במסדים שאני מכיר כאשר אתה לא נותן מיון התוצאה הוא undefined behaviorבעיני (זה אולי רגשי) יותר אקראי לתת לכל אחד מס' אקראי ולמיין ברמת הDB
כן, נראה לי שזה רגשי...
אלא אם כן פספסתי משהו, שזה הגיוני לגמריאני אולי ילדותי אבל אני מרגיש סיכויים נמוכים לrandom להחזיר 0 או 1.
ברור שיש סיכוי נמוך מאוד לזה, אבל זה לא משפיע על התוצאה
לכן הרחבתי בסוגריים שלא צריך 1 או 0 כדי לקבל את הרשומה הראשונה או האחרונה -
@yossiz כתב בקוד לביצוע הגרלה. האם הוא תקין?:
אחרת ה-DB יכול להחליט להיות רשע ולהביא דוקא משתמש X בכל פעם
אהה, הבנתי. אתה מדבר על הskip, זה לא רשעות, אדרבא הייתי משבח אותו על חכמה כי מה המשמעות לskip כשלא ציינת מיון.
(לא מצאתי בwix תיעוד לסדר הדיפולטי, אני חושב שאי אפשר להשליך משאר הDB אליהם).@אבי-203 לסיכום הקוד שלך מצויין והוגן כלפי המשתתפים, רק תכניס מיון בשאילתה שבוחרת את הזוכה (זו עם הskip).
כפי שיוסי הסביר, הrandom נותן תוצאה בין 0 ל1, אם מספר הזוכים הוא למשל 20 אז כל המרחב שבין 0.0 ל1 מחולק ל20 והכפל ייתן תוצאה הוגנת ושיוויונית של בין 0 ל19.