שאלה ב-C#

liron50

New member
שאלה ב-C#

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

רשמתי את הקוד הבא:

שכל מה שהוא עושה זה לייצר מערך של 4 אובייקטים- RandomNumber - בכ"א מהאובייקטים מספר רנדומלי בין 0-9,

הנקודה המעניינת מבחינתי היא שכשאני מככב את המילה static-
/*statuc*/ Random gen = new Random();
אזי בכל האובייקטים המספר המוגרל הוא אותו זהה, לעומת זאת אם מורידים את הכיכוב מהמילה static, אז באמת כל אווביקט
מקבל מספר שונה.

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


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestRandomObject
{
class Program
{
static void Main(string[] args)
{
RandomNumber[] numArr = new RandomNumber[4];

for (int i = 0; i < numArr.Length; i++)
numArr = new RandomNumber();

String numberStr = "";

for (int i = 0; i < numArr.Length; i++)
numberStr+=" " + numArr.getNumber();

Console.WriteLine("Number Gets: " + numberStr);
Console.ReadKey();

}
}


public class RandomNumber
{
private int number;

/*statuc*/ Random gen = new Random();

public RandomNumber()
{

number = gen.Next(11);
}

public int getNumber()
{
return number;
}

}

}
 

selalerer

New member
אתה מערבב פה שני נושאים שונים.

אחד זה מה עושה המילה static.
השני זה איך עובד אובייקט Random.

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

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

liron50

New member
נשמע הגיוני ההסבר

תודה.

רק שקצת מוזר שהקוד הזה העתקתי אותו מתוכנית ב-JAVA ופשוט
שיניתי מעט את ה-syntax שיתאים ל-C#.

למעשה ניסיתי עכשיו תרגיל דומה ב-JAVA, וזה עובד נכון בלי קשר לאיך
שאני מגדיר את האובייקט Random.
האם זה בגלל שבשתי השפות מימשו את ה-Random בצורה שונה?
 
It's a timing issue

It does not 'work' or 'not work' in either C# or Java. Maybe Java is much slower than C#. Maybe the clock resolution is different. Maybe you're comparing completely different build settings in terms of debug/release and optimization. Who knows
 
סליחה כשאתה *מככב* את המילה סטטי

זה ברור, מהסיבה ש-selalerer ציין.
ממילא יותר הגיוני במקרה הזה שה-random generator יהיה סטטי.
 
למעלה