עבור לתוכן

פרמוטציות רנדומליות על מערך (C#)

Featured Replies

פורסם

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



public static void RandomPermuteOfArray(int[] arr, int n)
{
Random rand = new Random();
int i;
int currentIndex = 0;


for (i = n - 1; i >= 1; i--)
{
currentIndex = rand.Next(0, i + 1);
swap(ref arr[i], ref arr[currentIndex]);
}
}

פורסם

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

פורסם
  • מחבר

נכון וזה ברור למה :)

תודה...

פורסם

היי,

למה היית צריך את המיל ref לפני ה- arr?

פורסם

אחרת ה-swap לא היה מחליף ביניהם.

פה יש דוגמה שמסבירה את העניין:

http://webmaster.org.il/articles/csharp-parameters-ref-out

שים לב שכשמגדירים ארגומנטים לפונקציה כ-ref, אז גם כשקוראים לפונקציה חייבים לשים ref.

אופציה נוספת הייתה לא להעביר את התאים עצמם במערך, אלא את כל המערך ואינדקסים אליו, כלומר במקום ש-swap תראה ככה:

void swap(ref int x, ref int y) {... }

היא תראה ככה:

void swap(int[] arr, int i, int j) {... }

(השיטה השנייה, אגב, היא יותר יעילה, אבל זה די זניח)

נערך על-ידי שניצל

ארכיון

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

דיונים חדשים