עבור לתוכן

בעיה מוזרה בהגרלת מספרים למערך בC#

Featured Replies

פורסם

היי כתוצאה מהשיעמום של החופש וחיפושי מקומות תעסוקה אני מנסה לפתח את התוכנה הבאה:

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

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

using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] arr = ReturnRandomArr(7);
int[] WinArr = ReturnRandomArr(8);
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i]+",");
}
Console.WriteLine();
for (int i = 0; i < WinArr.Length; i++)
{
Console.Write(WinArr[i] + ",");
}
Console.WriteLine();
//int count = 0;
//for (int i = 0; i < arr.Length; i++)
//{
// for (int j = 0; j < WinArr.Length; j++)
// {
// if(arr[i]==WinArr[j])
// count++;
// }
//}
//if (count > 3)
// Console.WriteLine("3 correct numbers!");

}

public static int[] ReturnRandomArr(int arrLenght) //Generates an array with
{ //differnet random numbers
int[] randArr = new int[arrLenght];
for(int i=0;i<randArr.Length;i++)
{
randArr[i]=0;
}
Random rand = new Random();
int count=0,x;
bool flag;
while(count<randArr.Length)
{
flag = true;
x = rand.Next(1, 26);
for (int i = 0; i < randArr.Length; i++)
{
if (x == randArr[i])
{
flag = false;
}
}
if (flag)
{
randArr[count] = x;
count++;
}

}
return randArr;
}
}
}

פורסם

בלי לקרוא את הקוד שלך ידעתי מה הבעיה :)

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

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

פורסם
  • מחבר

תודה לך :)

אתה יכול להסביר איך עושים את זה? (אני בטוח שזה עניין של שורה אחת רק אני לא יודע מהו הSYNTAX)

פורסם

הכי פשוט - תוסיף את המילה static בתחילת השורה שבה אתה מגדיר את ה-Random.

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

אופציה קצת יותר טובה היא להגדיר את הרנדום כאיבר סטטי של המחלקה. תוסיף ,מחוץ להגדרה של הפונקציות (נניח, לפני השורה static void main), את ההגדרה הבאה:

private static Random rand = new Random();

וכמובן תמחק את ההגדרה שבתוך הפונקציה.

פורסם
  • מחבר

אוקיי תודה הסדרתי.. עכשיו יש לי משהו חדש שאני רוצה להוסיף :

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

חיפשתי בגוגל לגבי זה וזה הביא אותי למשהו שקוראים לו FlashWindow , רק אני לא יודע איך לשלב את זה בתוך הCONSOLE APP..

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

פורסם
  • מחבר

לא הצלחתי להתסדר עם זה :s05: אולי בגלל שזה עובד רק בWINDOWS APPLICATION ולא בCONSOLE הפשוט יותר..

בכל מקרה מה דעתכם על התוכנית הזו: (התוכנה עצמה נמצאת פה)

using System;
namespace Lottery
{
class Program
{
private static Random rand = new Random();
//public Random rand;
static void Main(string[] args)
{
int x = 0;
do
{
Console.WriteLine("How many numbers do you want to be guessed? from 1 to 8");
x = int.Parse(Console.ReadLine());
} while ((x > 8) && (x < 1));
int count = 0;
double timesCount = 0;
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();

int[] WinArr = ReturnRandomArr(8);
while (count < x)
{
stopWatch.Start();
timesCount++;
count = 0;
int[] arr = ReturnRandomArr(8);
Console.WriteLine("-------{0}-------", timesCount);
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i] + ",");
}
Console.WriteLine();


for (int i = 0; i < arr.Length; i++)
{
for (int j = 0; j < WinArr.Length; j++)
{
if (arr[i] == WinArr[j])
count++;
}
}
}
stopWatch.Stop();
Console.WriteLine();
Console.WriteLine("WinTicket:");
for (int i = 0; i < WinArr.Length; i++)
{
Console.Write(WinArr[i] + ",");
}
Console.WriteLine();
Console.WriteLine("----------------");
//Console.WriteLine(count+" correct numbers!");
Console.WriteLine("Time Passed: " + stopWatch.Elapsed);
Console.WriteLine(NumWithCommmas(timesCount) + " times the lottery has been done.");
Console.WriteLine("----------------");
Console.WriteLine("The chance of getting {0} right numbers is: {1}", x, 1 / timesCount);
Console.ReadLine();
}

public static int[] ReturnRandomArr(int arrLenght) //Generates an array with
{ //differnet random numbers
int[] randArr = new int[arrLenght];
for (int i = 0; i < randArr.Length; i++)
{
randArr[i] = 0;
}

// Random rand = new Random();
int count = 0, x;
bool flag;
while (count < randArr.Length)
{
flag = true;
x = rand.Next(1, 46);
for (int i = 0; i < randArr.Length; i++)
{
if (x == randArr[i])
{
flag = false;
}
}
if (flag)
{
randArr[count] = x;
count++;
}

}
return randArr;
}

public static string NumWithCommmas(double num)
{
string PartA = "";
string PartB = "";
string growingstring = "";
//double MyInteger = num;
string whatihave = num.ToString();
int Length = whatihave.Length;
if (num > 999)
{
do
{
PartA = whatihave.Substring(0, Length - 3);
PartB = whatihave.Substring(Length - 3, 3);
growingstring = "," + PartB + growingstring;
whatihave = PartA;
Length = whatihave.Length;
}
while (Length > 3);

if (whatihave == "")
{
growingstring = growingstring.Substring(1, growingstring.Length);
}
else
{
growingstring = whatihave + growingstring;
}
return growingstring;
}
else
{
return num.ToString();
}
}
}
}

[attachment deleted by admin]

פורסם

סבבה.

טיפ קטן - את הפונקציה NumWithCommas יכלת להחליף בזה:

num.ToString("N");

פורסם

וואי

פעם נתקלתי בדיוק באותה הבעיה.

בניתי משחק בין 2 רובוטים שנעים קדימה ואחורה והראשון שמגיע ל-100 מנצח (התנועה שלהם נקבעת ע"י הגרלה) ולא הצלחתי להבין למה הרובוט השני עושה בדיוק אותו דבר שעושה הרובוט הראשון :bash:

עכשיו זה עובד

ארכיון

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

דיונים חדשים