הסתברות בג'אווה

1. סקירה כללית

במדריך זה נבחן כמה דוגמאות כיצד אנו יכולים ליישם הסתברות ב- Java.

2. הדמיית הסתברות בסיסית

כדי לדמות הסתברות ב- Java, הדבר הראשון שעלינו לעשות הוא ליצור מספרים אקראיים. למרבה המזל, ג'אווה מספקת לנו הרבה מחוללי מספרים אקראיים.

במקרה זה נשתמש ב- SplittableRandom בכיתה משום שהיא מספקת אקראיות איכותית ומהירה יחסית:

SplittableRandom אקראי = SplittableRandom חדש ();

ואז עלינו ליצור מספר בטווח ולהשוות אותו למספר אחר שנבחר מתוך אותו טווח. לכל מספר בטווח יש סיכוי שווה להגרל. כפי שאנו מכירים את הטווח, אנו יודעים את ההסתברות לצייר את המספר שבחרנו. בדרך זו אנו שולטים בהסתברות:

כנראה בוליאני False = random.nextInt (10) == 0

בדוגמה זו שרטטנו מספרים מ -0 עד 9. לכן ההסתברות לשרטוט 0 שווה ל -10%. עכשיו, בואו נקבל מספר אקראי ונבדוק אם המספר הנבחר נמוך מהמספר המצויר:

בוליאני whoKnows = random.nextInt (1, 101) <= 50

כאן, שרטטנו מספרים מ -1 ל 100. הסיכוי שהמספר האקראי שלנו יהיה פחות או שווה ל 50 הוא בדיוק 50%.

3. הפצה אחידה

ערכים שנוצרו עד לנקודה זו נופלים להתפלגות האחידה. זה אומר ש לכל אירוע, למשל לזרוק מספר כלשהו על קוביות, יש סיכוי שווה להתרחש.

3.1. הפעלת פונקציה עם סבירות נתונה

עכשיו, נניח שאנחנו רוצים לבצע משימה מעת לעת ולשלוט בהסתברותה. לדוגמא, אנו מפעילים אתר מסחר אלקטרוני ואנחנו רוצים לתת הנחה ל -10% מהמשתמשים שלנו.

לשם כך, בוא נשתמש בשיטה שתיקח שלושה פרמטרים: ספק להפעיל באחוזים מסוימים מהמקרים, ספק שני להפעיל בשאר המקרים, וההסתברות.

ראשית, אנו מצהירים על שלנו SplittableRandom כפי ש עָצֵל באמצעות Vavr. בדרך זו נפתח את זה רק פעם אחת, על פי בקשה ראשונה:

גמר פרטי Lazy random = Lazy.of (SplittableRandom :: new); 

לאחר מכן נבצע את הפונקציה לניהול ההסתברות:

ציבורי עם סבירות (ספק חיובי, ספק שלילי, סבירות int) {SplittableRandom אקראי = this.random.get (); אם (random.nextInt (1, 101) <= הסתברות) {return positiveCase.get (); } אחר {return negativeCase.get (); }}

3.2. הסתברות דגימה בשיטת מונטה קרלו

בואו נהפוך את התהליך שראינו בסעיף הקודם. לשם כך נמדוד את ההסתברות בשיטת מונטה קרלו. זה מייצר נפח גבוה של אירועים אקראיים וסופר כמה מהם מספקים את התנאי שסופק. זה שימושי כאשר ההסתברות קשה או בלתי אפשרית לחישוב אנליטי.

לדוגמא, אם נסתכל על קוביות בעלות 6 צדדים אנו יודעים שההסתברות לגלגל מספר מסוים היא 1/6. אבל אם יש לנו קוביות מסתוריות עם מספר לא ידוע של צדדים, יהיה קשה לדעת מה ההסתברות. במקום לנתח את הקוביות נוכל פשוט לזרוק אותה מספר רב של פעמים ולספור כמה פעמים מתרחשים אירועים מסוימים.

בואו נראה כיצד נוכל ליישם גישה זו. ראשית, ננסה לייצר את המספר 1 בהסתברות של 10% למיליון פעמים בתשחץ:

int numberOfSamples = 1_000_000; הסתברות int = 10; int howManyTimesInvoked = Stream.generate (() -> randomInvoker.withProbability (() -> 1, () -> 0, הסתברות)). limit (numberOfSamples) .mapToInt (e -> e). sum ();

לאחר מכן, סכום המספרים שנוצרו חלקי מספר הדגימות יהיה קירוב להסתברות האירוע:

int monteCarloProbability = (howManyTimesInvoked * 100) / numberOfSamples; 

שימו לב, ההסתברות המחושבת היא מקורבת. ככל שמספר הדגימות גבוה יותר, כך הקירוב יהיה טוב יותר.

4. הפצות אחרות

ההפצה האחידה עובדת היטב לדוגמנות של דברים כמו משחקים. כדי שהמשחק יהיה הוגן, לעתים קרובות כל האירועים צריכים להיות בעלי אותה הסתברות לקרות.

עם זאת, בחיים האמיתיים, הפצות בדרך כלל מורכבות יותר. הסיכויים אינם שווים שדברים שונים יתרחשו.

לדוגמא, יש מעט מאוד אנשים נמוכים במיוחד ומעטים מאוד גבוהים במיוחד. רוב האנשים הם בגובה ממוצע, מה שאומר שגובה האנשים עוקב אחר ההתפלגות הנורמלית. אם עלינו לייצר גבהים אנושיים אקראיים, לא יספיק לייצר מספר רגליים אקראי.

למרבה המזל, איננו צריכים ליישם את המודל המתמטי הבסיסי בעצמנו. עלינו לדעת באיזו הפצה להשתמש וכיצד להגדיר אותה, למשל, שימוש בנתונים סטטיסטיים.

ספריית Apache Commons מספקת לנו יישומים למספר הפצות. בואו ניישם את ההתפלגות הרגילה:

כפול סופי סטטי פרטי MEAN_HEIGHT = 176.02; כפול סופי סטטי פרטי STANDARD_DEVIATION = 7.11; הפצה סטטית פרטית של NormalDistribution = NormalDistribution חדשה (MEAN_HEIGHT, STANDARD_DEVIATION); 

השימוש ב- API זה פשוט מאוד - שיטת הדוגמה שואבת מספר אקראי מההפצה:

כפול סטטי ציבורי createNormalHeight () {return distribution.sample (); }

לבסוף, בואו נהפוך את התהליך:

הסתברות כפולה סטטית פומביתOfHeightBetween (double heightLowerExclusive, double heightUpperInclusive כפול) {distribution distribution.probability (heightLowerExclusive, heightUpperInclusive); }

כתוצאה מכך נקבל את ההסתברות שלאדם יהיה גובה בין שני גבולות. במקרה זה, הגובה התחתון והגבוה.

5. מסקנה

במאמר זה למדנו כיצד ליצור אירועים אקראיים וכיצד לחשב את ההסתברות שהם יתרחשו. השתמשנו בהפצות אחידות ונורמליות כדי לדגמן מצבים שונים.

ניתן למצוא את הדוגמה המלאה ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found