פורסם 2011 בדצמבר 114 שנים אני מנסה להבין למה הפלט שונה בין 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);}השאלה שלי היא למה זה כל כך משנה איפה לולאת הפור אם בכל מקרה המחשב אמור לחולל מספר אקראי? העובדה היא שבתוכנית כשהלולאה במקום ה'נכון' אני מקבל מספרים אקראים שונים בתוכנית, ובלולאה השניה אני מקבל את אותם שני מספרים בכל הרצף.תודהשי
פורסם 2011 בדצמבר 114 שנים rand לא באמת יודע לחולל מספרים אקראיים. הוא מחולל סדרה פסאודו-אקראית של מספרים (כל פעם שתקרא לו הוא יתן לך את המספר הבא בסדרה), שנקבעת לפי הפרמטר שהועבר ב-srand. אם תעביר משהו קבוע תמיד ל-srand, אז תמיד תקבל את אותה סדרה בדיוק. לכן, אם בזמן קצר (זמן מספיק קצר כך שהשעון לא מספיק להתחלף) אתה קורא ל-(srand(time(NULL אז בשתי הפעמים העברת ל-srand בדיוק את אותו המספר, ולכן rand יחזיר בשתי הקריאות שאחרי ה-srand את אותו הערך.
פורסם 2011 בדצמבר 214 שנים מחבר תודה על התשובה אבל לא ברור לי עדיין למה הפלט שונה כשהפונקציה srand נמצאת מחוץ ללולאה. ע"פ ההיגיון שבהסבר שלך כל עוד הפונקציה פועלת בזמנים שונים המספרים אמורים להיות שונים בלי קשר לאיפה היא נמצאת (בפנים\מחוץ ללולאה).
פורסם 2011 בדצמבר 214 שנים מחבר כי אתה קורא לה שוב ושוב בתוך הלולאה לעומת פעם אחת מחוצה לה.נכון, אבל למה זה משנה את הפלט?
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.