Random ב-Java

[11 ביוני 2008] [24 תגובות]

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

הקוד הבא יגריל מספר עשרוני, בין 0 ל-1 (לא כולל את המספר 1) ויכניס אותו למשנה f. שימו לב שהמשתנה f הוא מסוג double היכול להכיל מספר עשרוני:

double f = Math.random();

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

  • 0.08145274834969818
  • 0.9047754473096659
  • 0.31409249069225864

בדוק את עצמך

הקוד הבא תמיד מדפיס את המילה True למסך (מכיוון ש-f תמיד שווה ל-f):

double f = Math.random()
System.out.println(f==f);

האם הקוד הבא ידפיס למסך True או False ?

System.out.println (Math.random()==Math.random());

(אם אינך יודע את התשובה, כתוב תוכנית Java ובדוק זאת)

זריקת מטבע

נניח ונרצה שהמחשב "יזרוק" עבורנו מטבע ויכריז מה התקבל: עץ או פלי. נוכל להגריל מספר אקראי בין 0 ל-1 ולבדוק האם הוא קטן מ-0.5 (ואז להחליט: עץ-Heads) או גדול מ-0.5 (להחליט פלי-Tails).

בקוד Java נכתוב זאת כך:

double f = Math.random();
if (f<0.5){
        System.out.println("Heads");
}
else{
        System.out.println("Tails");
}

זריקת קובייה

מטבע הכיל רק שתי תוצאות אפשריות, עץ ופלי, אך לקובייה ישנם 6 תוצאות אפשריות. לכן ננקוט בשיטה מעט שונה:

  1. נגריל מספר עשרוני בין 0 ל-1 ונשמור את ערכו למשתנה f (בדיוק כפי שעשינו עובר קובייה).
  2. נכפיל את התוצאה ב-6. המספר החדש שהתקבל כעת נע בין 0 ל-6 (לא כולל 6).
  3. המספר שקיבלנו הוא עשרוני. נהפוך אותו למספר שלם על ידי ביצוע casting ל-integer. למעשה הפכנו מספרים כמו 4.35 ל-4.
  4. כעת יש בידינו מספר שהוא אחד מהבאים: 0,1,2,3,4 או 5.
  5. נוסיף למספר שקיבלנו 1 ונקבל את האפשרויות הרצויות מהטלת קובייה: 1,2,3,4,5 או-6.

נתרגם את האלגוריתם הקטן שלנו לקוד של Java, ובסוף נדפיס את f:

double f = Math.random();
f = f * 6;
f = (int) f;
f = f + 1;
System.out.println(f);

הערה: שימו לב כי f נוגדר כמספר עשרוני ולכן כאשר נדפיס אותו, נקבל תשובות בצורה 3.0 ולא בצורה 3.

כמובן שנוכל לכתוב את הקוד להטלת קובייה בצורה חסכונית יותר:

int f = (int) ((Math.random()*6)+1);

מכיוון שהמספר הסופי הוא מספר שלם(1,2,3,4,5 או 6) הגדרנו את f להיות מספר שלם(int) כבר מההתחלה. כעת שנדפיס אותו נקבל תוצאות בצורה 4 ולא 4.0.

הגרלת מספרים שלמים בטווח

תיקון: תודה רבה לאורבץ שהגיב והפנה את תשומת ליבי לטעות שפורסמה בפיסקה הבאה. עכשיו הכל תקין.

כפי ששמתם לב, בהטלת קובייה רצינו לקבל מספר בין 1 ל-6. נוכל להכליל זאת ולחפש מספר בטווח low עד high ואז להשתמש בקוד הבא:

int f = (int) ((Math.random()*(high-low+1))+low);

כאשר high-low+1 הוא מספר האפשרויות(בקובייה היו לנו 6) ו-low שנוסף בסוף השורה הוא המספר הכי נמוך שאפשר לבחור. נסו להבין כיצד זה עבד בקובייה.

אם נרצה להגריל מספר שלם בין 15 ל-58, פשוט נעשה זאת כך:

int f = (int) ((Math.random()*(58-15+1))+15);

זה הכל על בחירת מספר אקראי ב-Java.

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

24 תגובות

  1. אורבץ | 9/5/2008 7:14:52 AM

    לכל מי שלא מוצא את עצמו יש םה טעות בהגרלת מספר בטווח מסוים

    בין 15 ל 58 זה יהיה

    int f = (int) ((Math.random()*(58-15+1))+15);

    כי בראנדום יצא 0.9999999 * (58-15+1) 44 אז יצא 43 ופלוס 15 יתן את המקסימום שזה 58

    ואם ברנדום יצא0.0000000001 * 44 +15 יתן את המינימום שזה 15 וכך יצא הטווח 15 עד 58

  2. טל | 9/5/2008 7:39:33 AM

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

  3. קטן | 3/9/2009 10:19:12 AM
    איך עושים רנדום לint ואיך מחליטים שמספר ההגרלות יהיה זוגי?
  4. טל | 3/10/2009 1:21:44 PM

    בפוסט כתוב רק איך להגריל מספר לתוך int כפי שאתה מבקש לעשות. כמו כן לא דובר על מספר ההגרלות... אתה יכול לקבוע אותו לבד.

    אני חושש שלא הבנתי את השאלות שלך עד הסוף... תנסה להרחיב

  5. בדוי | 5/29/2009 4:13:37 AM
    אפשר גם לבנות משחקים בJava? 
  6. טל | 5/31/2009 9:42:44 AM

    בוודאי שאפשר לכתוב משחקים ב-Java, אפילו משחקי תלת מימד.

    עם זאת, שפת C++ מותאמת יותר לכתיבת משחקים וניתן לנצל שם את מירב המשאבים של המחשב.

  7. איליה | 8/28/2009 3:15:06 AM

    טלל שוב תודה לך על המדריכים המעולים האלה

     

    באמת שבזכותך השפה קלה לי מאוד  אתה ממש סוססס=)

    באמת יש לך קישרון להסיבר תודה =]

     

    ויש לי שאלה כל מה שפירסמתה עד העכשיו זה כל מה שיש בשפת JAVA הוא שיש עוד?

     

    אם יש עוד תוכל בבקשה לפרסם זה מאוד יעזור=)תודה

  8. טל | 8/28/2009 8:16:10 AM

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

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

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

  9. איליה | 8/28/2009 1:26:43 PM

    אוקי תודה

     

    בכללי מה אפשר לעשות אם JAVA

     

    אפשר לבנות אם זה משפחקים

     

    ולבנות תוכנות?

  10. טל | 8/29/2009 5:14:09 AM

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

  11. איליה | 8/29/2009 5:25:58 AM

    אהה מגניב תודה

     

    רגע אתה תפרסם פה מידעה על תיכנון מונחה עצמים 

     

    אם לא תוכל להסיבר לי בקצרה בבקשה מה זה ומה עושים אם זה

     

    כי חיפשתי ומצאתי תשובות טיפה קשות להבנה

     

    ויש לי עןוד שאלה בן כמה אתה חח =)

  12. shahar | 9/2/2009 5:33:08 AM

    http://vlib.eitan.ac.il/Java1/

    אחלה אתר להתחיל

    שחר

  13. אלי | 10/29/2009 2:24:44 PM
    לא הבנתי בדיוק את פעולת הכפל בחישוב של מספר בטווח זה לא ברור לי אשמח לפירוש מי שיכול על זה ?
  14. מתן | 12/10/2010 8:43:03 AM

    אהלן! שאלה קטנה לגבי הגרלת מספרים

    האם אפשר בעזרת הנוסחה הזאת להגריל גם מספרים שליליים? נניח בין 30- ל30?

    תודה רבה 

  15. טל | 12/11/2010 3:29:42 AM

    מתן, בוודאי שאפשר.

    תגריל מספר בין 0 ל-60 (בדומה לקוביה, אך שים לב שבין 0 ל-60 יש 61 מספרים) ואז תפחית מהתוצאה 30.

    כך תקבל שהמספר הכי נמוך הוא מינוס 30 והכי גבוה הוא 30. 

  16. דבורה | 2/8/2011 10:17:18 AM

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

    תודה 

  17. אבי | 3/18/2011 10:20:07 AM

    לדבורה->

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

  18. mor | 7/31/2011 3:56:24 PM

    אם אני רוצה להגריל מספר 5000 פעם שהוא בטווח בין 1-9 כיצד ארשום זאת?

     

  19. ברק | 1/2/2012 5:18:43 AM

    כתבתי קטע תוכנית. איך אני הופך את זה לתוכנה פעילה?

    (ז"א, יש ישום מחשבון במחשב. כתבתי את הקוד התוכנית למחשבון. איך אני הופך את זה, כך שזה יפתח כמו המחשבון?)

    אני מקווה שהשאלה שלי ברורה..

  20. יהונתן | 1/11/2012 6:21:23 AM

    תודה רבה על כל המדריכים! עשיתי את כולם ולמדתי המון.

     חבל שאין פה עוד מדריכים שממשיכים לרמות גבוהות יותר.

  21. יהליי | 10/13/2012 11:53:05 AM
    תודה רבה אחלה מדריכים!!
  22. סבטלנה שליחוב | 4/8/2013 4:52:28 AM

    שלום, 

    איך אפשר לעשות מטלה כזו:

    "לקבל לפחות פעם אחת את המספר 1 כאשר מגלגלים קוביה (רגילה) 6 פעמים, או לקבל לפחות שתי פעמים את המספר 1 כאשר מגלגלים קוביה (רגילה) 12 פעמים ? "

  23. הודיה | 1/12/2014 6:32:17 AM

    שלום!

    אם הגרלתי למשל 10 מספרים ואני רוצה לדעת אם הם ממוינים בסדר לא יורד איך אני עושה את זה? (ב-C++)

    תודה רבה!

  24. רון | 12/21/2016 4:13:54 PM

    שלום

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

התגובות נעולות