שאלה פשוטה ודחופה

shmints

New member
שאלה פשוטה ודחופה

מספר אקראי בין 0 ל-1 (double). הפונקציה rand (כמובן אחרי שעושים srand) נותנת לי כל הזמן 0, כשאני מבקשת את זה לתוך משתנה מסוג double. למספרים שלמים היא מחזירה מספרים אקראיים... איך מגרילים מספר אקראי בין 0 ל-1??? השתגעתי כבר
 

אלדד28

New member
פשוט מאוד

rand מחזירה לך int. כדי לקבל מספר בין 0 ל-1, תעשי:
int n; double d; n = rand(); d = 1/double(n);​
למשל.
 
רוב הסיכויים ש-1 חלקי int אקראי

יהיה שווה 0. לכן צריך פשוט לקחת מספר אקראי במודולו 2
rand() % 2​
ונגמר הסיפור.
 

shmints

New member
אז ככה: ../images/Emo4.gif

הראשון (של אלדד) באמת מחזיר רק 0 והשני (של טלמון) מחזיר או 0 או 1, אבל לא ביניהם... אם אני אשנה את השאלה שלי לשאלה הבאה, תוכלו לעזור יותר
? הצלחתי לעשות מספר שהוא double, וחילקתי ב-1000 על מנת ליצור מספר עם 3 ספרות אחרי הנקודה. איך אני מבטלת את השלם ומשאירה רק את המספרים שאחרי הנקודה העשרונית?
 

shmints

New member
טוב

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

ההתפלגות!... הצעה אחרת (לא הבנתי שצריך מספרים בין 0 ל-1):
( rand() % 1001 ) / double(1000);​
או איך שכותבים את זה...
 

אלדד28

New member
גם הפתרון הזה לא נכון התפלגותית,

כיוון ש-RAND_MAX (שהוא המספר הגבוה ביותר שיכול להתקבל ב-rand) אינו מתחלק ללא שארית ב-1001. ===> יש לך מספרים מסוימים שיעלו בגורל יותר מאחרים. הפתרון שלי עובד מצוין ולא "מחזיר אפס". הבעיה היחידה היא שלרוב הוא יוציא מספרים קטנים מאוד, כי ברגע שהמספר המוגרל יהיה גדול מ-1000, נגיד, אז התוצאה תהיה קטנה מ-0.001. בכל אופן, הפתרון שלך הוא בכיוון טוב, אבל עדיף להשתמש ב-1024 ו-1023. זה ייתן התפלגות כמעט מושלמת (כמעט, כי RAND_MAX הוא מספר ראשוני, 7FFF).
 
אם המקסימום של rand גדול מאוד

בהשוואה ל-1000, אז זה לא כל כך משנה. נגיד שהוא שווה 1,000,000,500 אזי (בגסות) נקבל 1,000,001 פעם שארית קטנה מ-501, ורק 1,000,000 פעם נקבל שארית גדולה מ-500. אבל מאידך, אתה צודק: למה דווקא 1000?
 

אלדד28

New member
אבל הוא לא גדול מאוד,

הוא בדיוק 32KB-1. זה אמנם תלוי במימוש, אבל ככה זה ב-WINDOWS.
 

אלדד28

New member
אבל הוא לא גדול מאוד,

הוא בדיוק 32KB-1. זה אמנם תלוי במימוש, אבל ככה זה ב-WINDOWS.
 

אלדד28

New member
לא, 2 בחזקת 15 (פחות 1), התכוונתי.

RAND_MAX הוא 32KB-1, שזה 2 בחזקת 15 (פחות 1).
 

erezsh

New member
הייתי בטוח שהוא מאפשר את כל ערכי ה

unsigned short int, כלומר עד 65535...
 

eyalbd

New member
זה תלוי מימוש

דהיינו ספריית C וקומפיילר. בלינוקס RAND_MAX == INT_MAX
 
למעלה