פורסם 2012 במאי 1113 שנים במסגרת עבודה אני אמור לבנות פונקציה שאמורה להגריל ערכים למערך. הערכים צריכים להיות בטווח שבין 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)
פורסם 2012 במאי 1113 שנים http://hwzone.co.il/community/index.php?topic=524569.msg4479414#msg4479414דאג לקרוא ל-srand פעם אחת בלבד בתחילת הקוד שלך.
פורסם 2012 במאי 1113 שנים מחבר הפונקציה אמורה להגריל לתוך מערך בגודל 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)תודה על העזרה!
פורסם 2012 במאי 1213 שנים הערה:ה-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; }באופן לא מפתיע, קיבלנו זמן ריצה טוב יותר על חשבון זיכרון...
פורסם 2012 במאי 1213 שנים מחבר תאמת נשמע רעיון די מבריק! אגב, לדעתי ברעיון שלך אין צורך בפונקציה rand אפשר פשוט לטעון מערך בגודל 2*N במספרים בסדר עולה ולערבבם N פעמים.
פורסם 2012 במאי 1213 שנים תאמת נשמע רעיון די מבריק! אגב, לדעתי ברעיון שלך אין צורך בפונקציה rand אפשר פשוט לטעון מערך בגודל 2*N במספרים בסדר עולה ולערבבם N פעמים. איך אפשר לבצע את הערבוב ללא rand?
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.