[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 תוצאות אפשריות. לכן ננקוט בשיטה מעט שונה:
- נגריל מספר עשרוני בין 0 ל-1 ונשמור את ערכו למשתנה f (בדיוק כפי שעשינו עובר קובייה).
- נכפיל את התוצאה ב-6. המספר החדש שהתקבל כעת נע בין 0 ל-6 (לא כולל 6).
- המספר שקיבלנו הוא עשרוני. נהפוך אותו למספר שלם על ידי ביצוע casting ל-integer. למעשה הפכנו מספרים כמו 4.35 ל-4.
- כעת יש בידינו מספר שהוא אחד מהבאים: 0,1,2,3,4 או 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.
לכל מי שלא מוצא את עצמו יש םה טעות בהגרלת מספר בטווח מסוים
בין 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
תודה רבה על התיקון... כנראה שכתבתי את סוף הפוסט בחוסר ריכוז. תיקנתי והודיתי לך בפוסט.
איך עושים רנדום לint ואיך מחליטים שמספר ההגרלות יהיה זוגי?
בפוסט כתוב רק איך להגריל מספר לתוך int כפי שאתה מבקש לעשות. כמו כן לא דובר על מספר ההגרלות... אתה יכול לקבוע אותו לבד.
אני חושש שלא הבנתי את השאלות שלך עד הסוף... תנסה להרחיב
אפשר גם לבנות משחקים בJava?
בוודאי שאפשר לכתוב משחקים ב-Java, אפילו משחקי תלת מימד.
עם זאת, שפת C++ מותאמת יותר לכתיבת משחקים וניתן לנצל שם את מירב המשאבים של המחשב.
טלל שוב תודה לך על המדריכים המעולים האלה
באמת שבזכותך השפה קלה לי מאוד אתה ממש סוססס=)
באמת יש לך קישרון להסיבר תודה =]
ויש לי שאלה כל מה שפירסמתה עד העכשיו זה כל מה שיש בשפת JAVA הוא שיש עוד?
אם יש עוד תוכל בבקשה לפרסם זה מאוד יעזור=)תודה
כמובן שיש עוד והרבה. עוד לא הספקתי להגיע לנושא הכי חשוב (תכנות מונחה עצמים) שבאמת מראה מה שפת Java מציעה.
לצערי, לוקח הרבה זמן לכתוב כל מדריך ואני לוקח את הזמן...
אם המדריכים עשו לך חשק להמשיך ללמוד את השפה, תוכל להמשיך לחפש חומר עליה באינטרנט או לקנות ספר הדרכה על Java. כשאני התחלתי ללמוד לא היה לי אינטרנט ועשיתי את זה בעזרת ספרים - דרך מאוד נוחה לעבודה.
אוקי תודה
בכללי מה אפשר לעשות אם JAVA
אפשר לבנות אם זה משפחקים
ולבנות תוכנות?
אפשר לעשות כל מה שאתה רוצה: תוכנות, משחקים, אתרי אינטרנט, אפליקציות לסלולר ועוד.
אהה מגניב תודה
רגע אתה תפרסם פה מידעה על תיכנון מונחה עצמים
אם לא תוכל להסיבר לי בקצרה בבקשה מה זה ומה עושים אם זה
כי חיפשתי ומצאתי תשובות טיפה קשות להבנה
ויש לי עןוד שאלה בן כמה אתה חח =)
http://vlib.eitan.ac.il/Java1/
אחלה אתר להתחיל
שחר
לא הבנתי בדיוק את פעולת הכפל בחישוב של מספר בטווח זה לא ברור לי אשמח לפירוש מי שיכול על זה ?
אהלן! שאלה קטנה לגבי הגרלת מספרים
האם אפשר בעזרת הנוסחה הזאת להגריל גם מספרים שליליים? נניח בין 30- ל30?
תודה רבה
מתן, בוודאי שאפשר.
תגריל מספר בין 0 ל-60 (בדומה לקוביה, אך שים לב שבין 0 ל-60 יש 61 מספרים) ואז תפחית מהתוצאה 30.
כך תקבל שהמספר הכי נמוך הוא מינוס 30 והכי גבוה הוא 30.
אנ רוצה להגריל מספר בין 8 ספרות, שיהיה לפי סדר, שלא יחזור על עצמו.
תודה
לדבורה->
נסי לחפש מדריך למערכים, או לתורים, ואז תוכלי להכניס לתוך המערך את הערכים שהגרלת, ולבצע לולאת IF על כל הגרלה, על מנת לוודא שהיא לא נקלטה כבר, ובמידה וכן- להגריל מספר חדש.
אם אני רוצה להגריל מספר 5000 פעם שהוא בטווח בין 1-9 כיצד ארשום זאת?
כתבתי קטע תוכנית. איך אני הופך את זה לתוכנה פעילה?
(ז"א, יש ישום מחשבון במחשב. כתבתי את הקוד התוכנית למחשבון. איך אני הופך את זה, כך שזה יפתח כמו המחשבון?)
אני מקווה שהשאלה שלי ברורה..
תודה רבה על כל המדריכים! עשיתי את כולם ולמדתי המון.
חבל שאין פה עוד מדריכים שממשיכים לרמות גבוהות יותר.
תודה רבה אחלה מדריכים!!
שלום,
איך אפשר לעשות מטלה כזו:
"לקבל לפחות פעם אחת את המספר 1 כאשר מגלגלים קוביה (רגילה) 6 פעמים, או לקבל לפחות שתי פעמים את המספר 1 כאשר מגלגלים קוביה (רגילה) 12 פעמים ? "
שלום!
אם הגרלתי למשל 10 מספרים ואני רוצה לדעת אם הם ממוינים בסדר לא יורד איך אני עושה את זה? (ב-C++)
תודה רבה!
שלום
אני רוצה לעשות קטע קוד שבו המשתמש יוכל להקליד מספר שמות ככל שהוא רוצה ואחר כך המחשב יגריל אחד מהם ויבחר אחד מהם באקראי, אני לא מצליח את החלק שהמחשב יבחר אקראית את השם מהמאגר שמות שהמשתמש כתב מישהו יכול לעזור בבקשה?