עבור לתוכן

שאלה בנוגע ל-random פלוס time בשפת C

Featured Replies

פורסם

אני מנסה להבין למה הפלט שונה בין 2 תוכניות שעל פניו לא נראה שקיים הבדל בין שתיהן:

שימו לב בבקשה ללולאת ה-for בשתי התוכניות.

התוכנית הראשונה:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int d1, d2, total;
int counter;
for(counter=0; counter < 15 ; counter++){
srand((unsigned)time(NULL));
d1 = rand() % 6 + 1;
d2 = rand() % 6 + 1;
total = d1 + d2;
printf("You rolled %d and %d: Total %d\n", d1, d2, total);}
return(0);
}

התוכנית השניה:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int d1, d2, total;
int counter;
srand((unsigned)time(NULL));
for(counter=0; counter < 15 ; counter++){
d1 = rand() % 6 + 1;
d2 = rand() % 6 + 1;
total = d1 + d2;
printf("You rolled %d and %d: Total %d\n", d1, d2, total);}
return(0);
}

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

תודה

שי

פורסם

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

פורסם
  • מחבר

תודה על התשובה אבל לא ברור לי עדיין למה הפלט שונה כשהפונקציה srand נמצאת מחוץ ללולאה. ע"פ ההיגיון שבהסבר שלך כל עוד הפונקציה פועלת בזמנים שונים המספרים אמורים להיות שונים בלי קשר לאיפה היא נמצאת (בפנים\מחוץ ללולאה).

פורסם

כי אתה קורא לה שוב ושוב בתוך הלולאה לעומת פעם אחת מחוצה לה.

פורסם
  • מחבר

כי אתה קורא לה שוב ושוב בתוך הלולאה לעומת פעם אחת מחוצה לה.

נכון, אבל למה זה משנה את הפלט?

פורסם

כי אתה "מאפס" את סדרת המספרים שהיא מספקת.

ארכיון

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

דיונים חדשים