פורסם 2011 באוגוסט 214 שנים שלום לכולם! יש לי בעיה באיזה תרגיל של הטלת קוביות. בתרגיל אני צריך ליצור את המחלקה קוביה: using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Dei { private int num; public Dei() { this.num = 1; } public void Roll() { Random rnd = new Random(); this.num = rnd.Next(1, 7); } public int GetNum() { return this.num; } }} בנוסף אני צריך לכתוב תוכנית שיוצרת שתי קוביות ובכל תור זורקת את שתי הקוביות עד שיוצא דאבל 6. בנוסף בכל תור היא רושמת את המספרים שיצאו. הבעיה שלי זה שיוא לי רק דאבלים ולא מספרים כמו 4,6 1,2 וכו'. מישהו יכול לומר לי איפה הבעיה?? using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class DiceGame { static void Main(string[] args) { Dei a = new Dei(); Dei b = new Dei(); int z=0; while ((a.GetNum() + b.GetNum()) < 12) { a.Roll(); b.Roll(); z++; Console.WriteLine("{0},{1}", a.GetNum(), b.GetNum()); } Console.WriteLine(z); } }} תודה מראש
פורסם 2011 באוגוסט 214 שנים אל תיצור אובייקט Random חדש בכל הטלת קובייה. צור רק אחד כזה ותשתמש בו שוב ושוב.
פורסם 2011 באוגוסט 214 שנים מחבר ככה? כי אם כן אז יוצאים רק דאבלים... class Dei { private int num; public Dei() { this.num = 1; } Random rnd = new Random(); public void Roll() { this.num = rnd.Next(1, 7); } public int GetNum() { return this.num; } }
פורסם 2011 באוגוסט 214 שנים אתה עדיין לא יוצר רק אחד - יש לך אובייקט Random בכל קוביה. אתה צריך שיהיה רק אחד (רמז: static). נ.ב. אין צורך לשים את המילה "this" לפני איברים של המחלקה. צריך לעשות את זה רק אם יש כפילות (נגיד, אם יש משתנה מקומי או פרמטר באותו שם). נ.ב.2. זה אמור להיות "Die", לא "Dei"
פורסם 2011 באוגוסט 214 שנים מחבר גם כשקראתי את ההסברים לא כ"כ הבנתי את העניין הזה עם STATIC...הבנתי שזה גורם שהתכונה תהיה משותפת לכל המופעים וכשהתכונה משתנה אצל מופע אחד אז היא משתנה בכולם, אבל לא הבנתי מתי אני אמור להשתמש בתכונות ופעולות של מופע ומתי בשל מחלקה(static)/נ.ב עשיתי את זה וזה עבד
פורסם 2011 באוגוסט 214 שנים איבר (member) רגיל של אובייקט נקרא "משתנה מופע" (instance variable). זה אומר שכל מופע של המחלקה (כלומר, כל אובייקט מהטיפוס של המחלקה) מחזיק איבר כזה משלו. אם יש מחלקה עם איבר בשם x אז ה-x הזה הוא נפרד לכל מופע של המחלקה.איבר סטטי (static member) נקרא גם "משתנה מחלקה" (class variable). זה אומר שהמשתנה הזה שייך למחלקה ולא למופעים שלה. כלומר, יש רק אחד כזה עבור כל המחלקה, במקום אחד עבור כל מופע.מתי אתה אמור להשתמש ב-static? מתי שאתה צריך, אין "חוקים" לזה. משתמשים ב-static כשאתה רוצה שיהיה לך אובייקט אחד שמשותף לכל המופעים השונים של מחלקה מסוימת.
פורסם 2011 באוגוסט 214 שנים מחבר לא הבנתי למה במקרה הזה צריך להיות אובייקט random אחד משותף לכל המופעים...למה זה שיש ך אובייקט אחד שמשותף גורם לכך שלא יצאו רק דאבלים?
פורסם 2011 באוגוסט 214 שנים זה נובע מאופן הפעולה של האובייקט Random.המחשב לא באמת מסוגל ליצור מספרים אקראיים. מה שהוא יוצר זה סדרה מתמטית של מספרים. הסדרה הזו צריכה להיות מאותחלת מאיזה מספר כלשהו, שנקרא הגרעין (Seed).אם תיצור שני אובייקטי Random עם אותו גרעין, אז שניהם יצרו בדיוק את אותה סדרה של מספרים אקראיים.ל-Random של #C יש שני בנאים - אחד שמקבל את הגרעין הזה (ראה כאן) ואחד שלא מקבל גרעין (זה הבנאי שבו השתמשת). זה שלא מקבל גרעין יוצר את הגרעין מתוך השעה הנוכחית (בדיוק של אלפיות או מיליוניות שנייה). כשאתה יוצר שני אובייקטי Random אחד אחרי השני, בסבירות גבוהה השעון של המחשב לא יספיק להתעדכן בין יצירת האובייקט הראשון לשני, מה שגורם לכך שלשניהם יש למעשה את אותו גרעין, ולכן הם יוצרים אותה סדרה.אתה יכול לנסות את זה בעצמך. תריץ את הקוד הבא (ב-Main אחר, בלי קשר לתכנית שלך):Random rnd1 = new Random();Random rnd2 = new Random();for (int i = 0 ; i < 10 ; i++){ System.Console.WriteLine("rnd1: {0}, rnd2: {1}", rnd1.Next(), rnd2.Next());}שני הרנדומים אמורים ליצור את אותה סדרה.ועכשיו, תוסיף את השורה הבאה בין שתי השורות הראשונות (כלומר בין השורה שיוצרת את rnd1 והשורה שיוצרת את rnd2), ותריץ את הקוד שוב:System.Threading.Thread.Sleep(100);(השורה הזו גורמת לכך שהתכנית תעצור למשך עשירית שנייה, כדי שנהיה בטוחים שהשעון יתעדכן)עכשיו שני הרנדומים אמורים ליצור סדרות שונות.
פורסם 2011 באוגוסט 214 שנים כי אז יש לך רק אובייקט אחד. אז כשאתה עושה פעמיים rnd.Next, במקום לקבל פעמיים את המספר הראשון בסדרה, תקבל את המספר הראשון בסדרה ואחריו את המספר השני בסדרה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.