עבור לתוכן

בעיית ראנדום בC#

Featured Replies

פורסם

צריך עזרה...

כאשר אני עושה משהו כמו זה:

Random rnd = new Random();

num1=rnd.Next();

num2=rnd.Next();

אז תמיד בתוכנית num1 וnum2 יוצאים אותו מס' למרות שזה לא אמור לצאת אותו מספר (אם אני מריץ עם F11 שני המספרים יוצאים שונים - כמו שצריך)

עזרה תתקבל בברכה!! (ואם אפשר כמה שיותר מהר!)

תודה!!

פורסם

קודם כל, כשאתה רושם קוד בפורום, תשתמש בטג קוד (כפתור # למעלה) כדי שהקוד יוצג כהלכה.

לגבי הבעיה שלך:

הם תמיד יוצאים אותו דבר, או שבכל ריצה של התכנית הם יוצאים משהו אחר?

כשאתה אומר "משהו כמו זה", למה אתה מתכוון בדיוק? אתה יכול להעלות את הקוד המדויק?

יכול להיות שאתה מאתחל את האובייקט rnd לפני כל קריאה ל-rnd.Next?

פורסם
  • מחבר

זה "משהו כמו זה" כי לא כתבתי מאיפה עד איפה יעשה רנדום (גבול עליון ותחתון או איך שלא קוראים לזה)

נגיד אני מדפיס

Console.WriteLine(num1+"and "+num2);

זה תמיד מדפיס (רק בתוכנית,לא בF11)

2 and 2 או 14 and 14 אבל אף פעם num1 ו2 לא יוצאים שונים!! למה???

נ.ב

נזכרתי שפעם עשיתי תוכנה שהדפיסה ל100 מספרים רנדומלים [לולאת for] את השורש שלהם ותמיד המסך היה נראה משהו כמו:

4

4

4

4

4

4

4

1.1

1.1

1.1

1.1

1.1

1.1

1.1

1.1

9

9

9

9

9

9

9

9

9

וכו' הבנת את העיקרון... יש פתרון או ניחוש מה לא בסדר??

תודה על העזרה!!

פורסם

Random rnd = new Random();

Random rnd2 = new Random();

num1=rnd.Next();

num2=rnd2.Next();

!??!

לזה אתה מתכוון?

פורסם
  • מחבר

לא...

בגדול מדובר על מתודה\פונקציה\איך שלא תקרא לזה שמביאה מס' רנדומלי

Random rnd = new Random();
num=rnd.Next();
return num;

ובMain

num1=שם המתודה;
num2=שם המתודה;

יש רק Random rnd = new Random(); (כך אמור להיות)

אבל רק כשאני עושה F5 או Shift F5 נאם1 ו2 שווים בF11 הם יוצאים 2 מספרים שונים..

עזרה??? ???

פורסם

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

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

פורסם
  • מחבר

זה במתודה כי זה מקבל מספר ולפי המספר הזה קובע את הגבולות העליונים והתחתונים(או איך שלא תקרא לתחום של ה)ראנדום

ואפשר פירוט על "תדאג שהמתודה והמתשנה הנ"ל יהיו סטטאטים."?? מה צריך לעשות??

תודה על העזרה!!

(אם תוכל לנסות להסביר קצת מה "שה new Random הוא מייצר את המספרים לפי seed של השעון הנוכחי ברזולוציה של מילישניות אני מניח" זה אומר זה יהיה נחמד לידע כללי... אבל השאלה למעלה יותר חשובה!)

פורסם

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

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

פורסם
  • מחבר

"אם זה ככה, תגדיר את המשתנה rnd פשוט לא בתוך המתודה אלא בתוך המחלקה שמכילה אותה, ותדאג לאתחל אותו פעם אחת בלבד (איפה שאתה מגדיר אותו)."

לא הבנתי מה זה לאתחל את המשתנה ואיפה אני אמור להגדיר אותו?? ניסיתי מעל למתודה לא עבד, ניסיתי בתוך הMain לא עבד, אפשר דוגמא למה לעשות?? תודה על העזרה!!!! :xyxthumbs:

פורסם

מאיפה לי לדעת את הסינטקס של השפה שלך.. תרשום פה את כל הקוד נראה איך לתקן.

פורסם
  • מחבר

public static int Name(int l)
{
int num;
Random ran = new Random();
num = ran.Next(l * 8 - 2, l * 9);
return num;
}

ובMain

num1=Name(l);
num2=Name(l);

זה בערך הכל...

אבל אני לא חושב שהבעיה היא בקוד כי אם כן אז איך בF11 (שלב אחרי שלב) זה עובד כמו שצריך??

תודה על העזרה המהירה!!

פורסם

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

תזיז את השורה

Random ran = new Random();

למחוץ הגדרת המתודה (אך עדיין תשאיר אותה בתוך המחלקה שלה).

אני רואה שהמתודה היא static אז גם המשתנה ran חייב להיות.

פורסם
  • מחבר

מצטער אני באמת לא הצלחתי להבין את ההסבר שלך...

לפי מה שכן הבנתי ניסית לעשות

class Program
{
Random ran = new Random();
public static int NumLevel(int level)
{

זה לא נחשב "תזיז את השורה Random ran = new Random(); למחוץ הגדרת המתודה (אך עדיין תשאיר אותה בתוך המחלקה שלה)."??

כשאני עושה את זה זה רושם Error ש:

An object reference is required for the nonstatic field, method, or property 'NameOfProject.Program.ran'

עזרה??? (מצטער שאני קשה, אני יחסית מתחיל בזה...)

תודה על הסבלנות! :yelclap:

פורסם

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

פורסם
  • מחבר

אבל לא הבנתי איך אני מגדיר את ran כstatic??

אני מרגיש טיפש.. :(

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים