עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

עזרה קטנה בנושא מספרים אקראיים ב-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...

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.