עבור לתוכן

עזרה קטנה בנושא מספרים אקראיים ב-C

Featured Replies

פורסם

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


{
int i,j,counter=0,member,k;
k=2*s;

for(;counter<s;)
{
srand(time(0));//for the 'rand' function
member = 1+ rand()%(k - 5 +1);//generate a random number
for(j=0;j<counter;j++)//make sure the number is not already int the array
{
if(member==set[j])
break;
}
if(j==(counter-1))
{
set[counter]=member;
counter++;
}
}
}
void generateSet(int set[],int s)

פורסם
  • מחבר

אוקי סידרתי את זה, ועדיין התוכנית לא עובדת כמו שצריך

פורסם

מה זה אומר "לא עובדת כמו שצריך"? מה היא אמורה לעשות ומה היא עושה?

פורסם
  • מחבר

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

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


{
int j,counter=0,member,k;
k=2*s;


while(counter!=s)
{

member = 1+ rand()%(k+1);//generate a random number
for(j=0;j<counter;j++)//make sure the number is not already int the array
{
if(member==set[j])
break;
}
if(j==(counter))
{
set[counter]=member;
counter++;
}
}
}
void generateSet(int set[],int s)

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

פורסם

הערה:

ה-Worst Case באלגוריתם שלך הוא זמן ריצה אינסופי (למה?).

הנה שיטה לעשות את מה שביקשת ב-Worst Case שהוא לינארי בטווח הערכים שאתה רוצה להגריל, כלומר 2*N (כמובן שיש דוגמאות שהטווח כל כך גדול שאי אפשר לעשות מה שאני הולך לכתוב עכשיו).

הרעיון הוא לאתחל מערך בגודל 2*N בערכים מ-1 עד ל-N*2 ואז לעשות "Shuffle" לאיבריו N פעמים.

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

הרעיון פשוט בסה"כ והקטע הטריקי בו הוא הערבוב של האיברים.

הרעיון הוא כזה:

באיטרציה הראשונה בוחרים מי האיבר שיהיה במקום האחרון במערך, שמים אותו שם מקטינים את גודל המערך ב-1.

וכך הלאה...

פסאודו קוד: (אני מניח שקראו ל-srand והמערך מאותחל כמו שתיארתי)

len = N*2;

for (int i=0; (i < N); ++i) /* Suhffle only N members */
{
theChosenMember = rand() % len; /* Select the member to be at the 'len' position */
swap(&array[len-1], &array[theChosenMember]); /* Put it there */
--len;
}

באופן לא מפתיע, קיבלנו זמן ריצה טוב יותר על חשבון זיכרון...

פורסם
  • מחבר

תאמת נשמע רעיון די מבריק!

אגב, לדעתי ברעיון שלך אין צורך בפונקציה rand אפשר פשוט לטעון מערך בגודל 2*N במספרים בסדר עולה ולערבבם N פעמים.

פורסם

תאמת נשמע רעיון די מבריק!

אגב, לדעתי ברעיון שלך אין צורך בפונקציה rand אפשר פשוט לטעון מערך בגודל 2*N במספרים בסדר עולה ולערבבם N פעמים.

:xyxthumbs:

איך אפשר לבצע את הערבוב ללא rand?

פורסם
  • מחבר

טעות שלי.כן צריך את הrand בשביל לבחור את המקומות במערך שגדול ב-2*N...

ארכיון

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

דיונים חדשים