עבור לתוכן

++c בעיה בהדפסת double

Featured Replies

פורסם

הפלט של התכנית הבאה אמור להיות מספר לא שלם, אבל כל הזמן מודפס לי 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;
}





פורסם
  • מחבר

בגלל זה כן הוספתי את (...)srand (ואת כל ה include'ים שצריך)

אבל דווקא זה מה שעשה (כנראה) את הבעיה.

שכזכור היא לא המספרים, אלא השבר שלא מודפס.

פורסם

כמו שכתוב ב-FAQ, הבעיה היא שאת קוראת ל-srand כל איטרציה של הלולאה, במקום פעם אחת בלבד. זה גורם לכך שהפונקציה randomNumber תמיד מחזירה אותו מספר בדיוק. את יכולה לנסות להבין מזה למה התכנית מדפיסה את מה שהיא מדפיסה.

הפתרון הוא לקרוא ל-srand פעם אחת בתחילת התכנית (ב-main), ולא בפונקציה randomNumber.

פורסם
  • מחבר

באמת זה מה שעשיתי בסוף,

אבל למה בdebug זה כן עבד כמו שצריך?

פורסם

כי ב-debug עובר מספיק זמן בין קריאות עוקבות ל-randomNumber. באופן שבו קראת ל-srand, מנגנון הרנדום של התוכנה מאותחל מהשעה הנוכחית. אם לא עובר מספיק זמן בין קריאות עוקבות לפונקציה, אז הוא יאותחל כל פעם מאותה השעה (כי השעון במחשב לא הספיק להתחלף).

ארכיון

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

דיונים חדשים