פורסם 2012 ביולי 2613 שנים הפלט של התכנית הבאה אמור להיות מספר לא שלם, אבל כל הזמן מודפס לי 0 או 1.כשעשיתי debug הפלט היה נכון - מספר לא שלם.למה זה קורה?איך אפשר לפתור את הבעיה?אגב,כשהורדתי את השורהsrand((unsigned)time(0));מהפונקציה randomNumber זה כן עבד כמו שצריך. מה הקשר?int randomNumber(){ srand((unsigned)time(0)); return rand()%3+1;}void game(int numOfAttempts){ double count1 = 0, count2 = 0, choice; for( int i = 0; i < numOfAttempts; i++){ choice = randomNumber(); if(choice == 1) count1++; //1 is the door with the car; else{ //choice = 2 or choice = 3; count2++; } } double noChange = count1/((double)numOfAttempts); double change = count2/((double)numOfAttempts); cout <<"When not changing the selection: "<< noChange<< endl; cout <<"When changing the selection: "<< change<< endl;}int _tmain(int argc, _TCHAR* argv[]){ game(10000); return 0;}
פורסם 2012 ביולי 2613 שנים בדיוק בשביל זה יש FAQ אני מנסה להגריל מספרים אקראיים, אבל אני מקבל את אותם מספרים שוב ושוב. למה?
פורסם 2012 ביולי 2613 שנים מחבר בגלל זה כן הוספתי את (...)srand (ואת כל ה include'ים שצריך)אבל דווקא זה מה שעשה (כנראה) את הבעיה.שכזכור היא לא המספרים, אלא השבר שלא מודפס.
פורסם 2012 ביולי 2613 שנים כמו שכתוב ב-FAQ, הבעיה היא שאת קוראת ל-srand כל איטרציה של הלולאה, במקום פעם אחת בלבד. זה גורם לכך שהפונקציה randomNumber תמיד מחזירה אותו מספר בדיוק. את יכולה לנסות להבין מזה למה התכנית מדפיסה את מה שהיא מדפיסה.הפתרון הוא לקרוא ל-srand פעם אחת בתחילת התכנית (ב-main), ולא בפונקציה randomNumber.
פורסם 2012 ביולי 2613 שנים כי ב-debug עובר מספיק זמן בין קריאות עוקבות ל-randomNumber. באופן שבו קראת ל-srand, מנגנון הרנדום של התוכנה מאותחל מהשעה הנוכחית. אם לא עובר מספיק זמן בין קריאות עוקבות לפונקציה, אז הוא יאותחל כל פעם מאותה השעה (כי השעון במחשב לא הספיק להתחלף).
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.