עבור לתוכן

סדרה של מספרים רנדומליים ושונים אחד מהשני C#

Featured Replies

פורסם

שלום

אני מחפש דרך לבחור קבוצה נניח 10 מספרים בטווח 0-50 בצורה רנדומלית ושכל בחירה תהיה ייחודית, בשיטה הבסיסית יש כפילויות..


Random random = new Random();
random.Next(0, 50);

והשפה כמובן C#

תודה

פורסם

כיוון שמדובר במספרים אקראיים , אתה לא בידיוק אמור לדעת מה יהיה המספר הבא,

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

יש לך 2 אפשרויות:

1) או שבעת קבלת מספר תסרוק את כלל המספרים שקיבלת עד עתה, לבדוק שהוא לא הופיע כבר.

2) לשמור מערך עזר של אינדיקטורים , האם קיבלת מספר מסוים.

הנה קוד לאפשרות השניה (עדיפה מבחינת מהירות)



Random random = new Random();
int [] randNum = new randNum[51];
int [] numbers = new numbers[10];
for (int count=0; count<10;)
{
int num=random.Next(0, 50);
if (randNum[num]==1)
{
continue;
}
randNum[num]=1;
numbers[count]=num;
count++;
}

פורסם

בקשר לסריקה של המספרים שהתקבלו עד כה, זה אפשרי במקרה של 10 מספרים אבל באופן כללי להגרלת מספר גדול של מספרים זה לא כל כך רצוי מסיבות ברורות.

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

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

פורסם

הדרך הכי יעילה להגריל מספרים בלי חזרות היא ליצור מערך עם כל המספרים האפשריים, ואז להחליף ביניהם באופן אקראי:


int arr[] = new int[50];
int result[] = new int[10];
for (int i = 0 ; i < 50 ; i++) {
arr[i] = i;
}

Random rnd = new Random();
for (int i = 0 ; i < 10 ; i++) {
int r = rnd.Next(i,50);
result[i] = arr[r];
arr[r] = arr[i];
}
return result;

כל פעם בוחרים איבר אקראי כלשהו מהמערך ושומר אותו במערך התוצאה, ואז "מוחקים" אותו מהמערך המקורי על ידי החלפה עם איבר מתחילת המערך. שימו לב שכשמגרילים את r אז מגרילים בין i ל-50 ולא בין 0 ל-50, כדי שלא נגריל איברים ש"מחקנו".

פורסם

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

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

אם למשל צריך לבחור 50 מספרים שלמים שונים בטווח 1-50 אז הסיכוי לחזרה הוא אפקטיבית 100%. במקרה הזה באמת הדרך של לבנות מערך עם המספרים האפשריים וכו' היא עדיפה.

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

פורסם
  • מחבר

תודה רבה :)

ארכיון

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

דיונים חדשים