מספר רנדומלי

tzahiel

New member
מספר רנדומלי

אני מחפש פונקציות שנותנות לי מספרים רנדומליים לאו דווקא INT אפשרות גם ל-FLOAT כאשר התפרסות המספרים הרנדומלים אחידה על פני טווח מוגדר כלומר סיכוי נמוך מאוד כי יתכן מצב ומתוך 100 מספרים רנדומליים בתחום 1-100 כולם יתרכזו בטווח 1-50
 

vinney

Well-known member
אני מבין ששני השרשורים קשורים

אז אני אענה לך פה כי השאלה שלך פה יותר ברורה. מספר רנדומלי מבוסס בד"כ על שעון, ולכן תמיד יהיה שלם. כדי לעשות FLOAT, תגריל פעמיים - פעם אחת את החלק השלם בתחום בו אתה מעוניין, ופעם אחד את החלק שאחרי הנקודה, בדיוק בו אתה מעוניין. בגדול, סתם שתדע, אין כזה דבר "מספר ממשי" במחשב, משום שבמחשב לא ניתן לייצג יותר ממספר ספרות מאוד מוגבל אחרי הנקודה (טוב, אלא אם כן אתה משתמש בשיטות חישוב מיוחדות, ולא בFLOAT/DOUBLE סטנדרטי). אתה יכול להגיע לדיוק יותר גדול של שבר על חשבון הקטנת התחום של החלק השלם. זה בעצם כל הרעיון בFLOAT (הנקודה הצפה בין הביטים של החלק השלם והשבר).
 

vinney

Well-known member
לא

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

amirb7

New member
ישנן הרבה פונ' שאפשר לבחור מהן

סדרה אחת לא רעה בכלל אפשר לקבל ע"י: קח מספר כלשהו בין 1 ל- 30,000 (כל מספר כמעט כמעט מעל 1,000 יעבוד טוב. עדיף שהמספר יהיה אי-זוגי). מספר זה נבחר פעם אחת בלבד בתחילת ריצת התוכנית - זהו בעצם ה- SEED של הפונקציה. נניח שבחרת את 5051. זהו המספר הראשון בסדרת המספרים האקראיים שלך, נסמן אותו ב- x0. המספר הבא נקבע ע"י הנוסחה:
X(n+1) = 170*X(n) MOD 30323​
כלומר:
x0 = 5051 // Remember:you set this number only once in a runtime. x1 = 170*5051 MOD 30323 = 9626 x2 = 170*9626 MOD 30323 = 29301 ...​
מתקבלת כאן סדרת מספרים "אקראית" של מספרים בטווח ם ועד 30322 (כולל). כדי לקבל סדרה יוניפורמית בין 0 ל-1 עליך לחלק כל מספר בסדרה הנ"ל ב-30323. זה ייתן לך סדרה לא רעה של מספרים "אקראיים" המתפלגים יוניפורמית. אל תריץ סדרות ארוכות מדי של מספרים אקראיים מהנוסחה הזו, אחרת ההתפלגות תהיה מוטית. [בוודאי לא יותר ממיליון מספרים בריצה אחת]. לצרכי יומיום הסדרה הזו כאמור לא רעה.
 

vinney

Well-known member
זה נראה כאילו אתה מוסכניק...

אתה עובד בהמצאת גלגלים מחדש ביום יום?
 

amirb7

New member
האמת היא ש...

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

vinney

Well-known member
אז התחביב שלך זה לשכתב את כל הספריה

הסטנדרטית? זה נחמד, כשיש לך זמן לשעשוע מיותר, אבל לא יותר מזה... אלגוריתם של RAND הוא אחד הבסיסיים יותר והפשוטים יותר שיש, אם אתה לא סומך עליו, איך אתה סומך על יעילות של strcmp או אמינות printf ? מה שיש בRAND מתחת למנוע זה בגדול מה שכתבת...
 

amirb7

New member
ממש לא נכון!

אם אתה מתכנת סוליטר ב-VB של אימפריית הרשע נניח - זה לא מעניין בכלל מי ומה. מבחינתך כמתכנת תוסיף גם את האזהרה של מיקרוסופט שהתוכנה יכולה לעשות נזק בלתי הפיך למחשב ולעזאזל המשתמש. אבל אם אתה צריך תוכנה קצת יותר מתקדמת, במיוחד אם זו תוכנה שבה הנומריקה קריטית (גם קריטית מבחינת ביצוע וגם מבחינת דיוק) אז בוודאי ובוודאי שאתה בודק טוב טוב מתחת למנוע ולא קונה סתם קומפיילרים מצלופן שהשד יודע מה איזה בוגר מדמ"ח ספונטני מרדמונד "שלא רצה להמציא את הגלגל" הכניס לתוכם. לא אחח הרצתי תוכניתנים ללמוד אנליזה נומרית או גיאומרטיה חישובית (באמת לעומק ולא איזה קורסון מתואר ראשון) אם הייתי צריך לפרוייקט שכולל חישובים קריטיים. אגב, אנשי מחשבים טובים באמת ("אנשי מחשבים" = בעיקר בוגרי מדמ"ח אך גם אלה ממתמטיקה והנדסת חשמל למשל) הלכו לבד ללמוד ופתחו ספרים שכללו גם לפחות קצת תיאוריה ולא רק ספרי "בישול" עם קטעי קוד מוכנים. - זה מה שהייתי מצפה מאיש מדמ"ח - לבדוק תמיד מתחת למנוע ולא משנה איזה תוכנה/קומפיילר/וכו' הוא מקבל לידיו - כאמור לעיל, הטובים (אם יורשה לי לחלק ציונים) עושים זאת מעצמם, לא משנה מה הרקע שלהם. וזה בהחלט לא"תחביב" - אלא כורח!. לבדוק, לבדוק, לבדוק ולבדוק. נ.ב. הפונקציה לעיל בהחלט תספיק לתכנות סוליטייר, אבל אם ראש פרוייקט סימולציה למשל, יראה שזו הפונקציה המשמשת את מנוע הסימולציה - התוכניתן עף הביתה באותו היום יותר מהר מטיל החץ.
 

annefan

New member
איזה כיף למתכנתים שלך!

הכי כיף להבין מה קורה מתחת למכסה המנוע. אני שמח שיש למתכנתים שלך את הזמן לעשות את זה. אתה גם שולח אותם להבין איך עובדת כל פונקצית ספריה? כל קריאת מערכת? אתה סומך עליהם ועל עצמך שפונקציית ה-rand שהם יכתבו תהיה אמנם אקראית יותר מזו שמסופקת עם "סתם קומפיילר מצלופן מרדמונד" (שנחשב לאחד הטובים בשוק ומהתואמים ביותר לסטנדרט, אגב), או של כמה האקרים מפרויקט GNU? אתה (והם) מודעים לקלות שבה אפשר לדפוק פונקצית rand ולהפוך אותה להרבה פחות אקראית? לא יותר פשוט ונכון להפנות אותם, לצורך העניין ל-Numerical Receipes in C, במקום לשלוח אותם לספרים באנליזה נומרית?
 

amirb7

New member
תראה/י ...

זה לא עניין של כיף, זה עניין של הכרח. ראשית צריך לסלק מהראש את הגישה שמה שארזו לנו יפה בצלופן הוא טוב. שופ דבר לא קדוש ואנשי מדעי המחשב הם הם אלה שצריכים "לפרק" תוכנות ומערכות ולבדוק תחת המנוע. נכון שיש הרבה חברות (גם גדולות) ששם שולפים ועובדים תוך כדי ובעזרת "סמוך" - עד ליום שהדברים מתפרקים (אצלך או אצל הלקוח). לדעתי האישית (ומניסיון לא מוע באילוצי דדליין) צריך לאזן. כפי שכתבתי בהודעה קודמת, העניין תלוי בהקשר: אם הפרויקט לא דורש אז כמובן שלא משקיעים רגע ב"פירוק" הקומפיילר, אלא רצים איתו. אבל כשצריך, כמו למשל לבנות פונ' rand "טובה" (או כל אלגוריתם/פונ' אחר/.) - אז בהחלט צריך להשקיע ב"בוכנות" של המנוע , למרות שזה גוזל זמן. - שוב הכל במידה. אגב, במקרה אני יודע בדיוק כמה קל לדפוק פונ' rand - ואני גם יודע איך תוכניתני רדמונד עושים זאת פעם אחר פעם (אחר פעם...). מי אמר ששם יודעים לבנות פונ' טובה? מי קבע? - רק בגלל שהם מוכרים לך את המוצר באריזה יפה, זה לא אומר שאתה צריך לקנות את שיקויי הקסם שלהם. אחרת למה צריך מקצוע "מדעי המחשב" 3 שנים? שילמדו כולם "תכנות בעזרת מוצרי מדף" במשך 3 חודשים. הידע הנוסף הוא מה שאמור להבדיל את אנשי מד"מח מסתם "קלדני קומפיילרים" (גם אם הם לא נזקקים ל- 90% ממנו בפרקטיקה). כמובן בכפוף למידתיות, לאילוצים ולשאר גורמים מתערבים. לעניין NR: הספר הוא מקום טוב להתחיל בו (ועושים זאת פעמים רבות), אבל הוא בהחלט כללי מדי במקרים רבים ולא תמיד מעודכן בחידושים האחרונים שלהם נזקקים לצורך פרוייקט מעמיק.
 

annefan

New member
איזון זה נהדר

"לחפור", אצלי לפחות, זה גם כיף. אני הראשון שיסכים אתך שצריך להבין כמה שיותר ממה שעושים. אבל, אני חושב שאתה קצת מקצין. האריזה של VS2002 היתה יפה לא פחות מזו של VS2003 ובכל זאת זה היה קומפיילר זוועתי, לעומת 2003 שהוא מעולה. מצד שני, כדי לדעת את זה אתה יכול לקנות, אתה יודע מה? לכתוב test-suite לקומפיילר ולבדוק _הכל_ (ויצא לי לעשות דבר כזה, אגב). מצד שני, אתה גם יכול לשאוב מידע ממקורות אחרים (comp.lang.c++.moderated) לדוגמא, מגזינים רציניים וכד'. אני לא חושב שבשלושה חודשים אפשר להפוך אדם בלי ידע למתכנת ב-++C, אפילו עם הקומפיילר של מיקרוסופט. (אני לא חושב ששלוש שנים באקדמיה, כפי שהיא ברוב המקומות מספיקות). ברור שלצרכים ספציפיים צריך לחפור, לחקור ולהמציא גלגל שלא קיים. ברמת השאלות והתשובות פה בפורום זה לא נצרך כמעט אף פעם.
 

vinney

Well-known member
ושוב חוזרים לדיון על אקדמיה?

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

annefan

New member
הא?

עבד איתי אחד שעשה תואר באו"פ, בחור מבריק בטירוף ומנוסה עוד יותר. התרגילים שהיו לו להגיש היו מטורפים! עשית תואר ו"כמעט ולא היה קוד"??
 

vinney

Well-known member
טוב, נו, או"פ

תלוי בקורסים
מכיוון שלא חסר לי תרגילים וקוד בעבודה, השתדלתי לבחור כמה שיותר קורסים תיאורטיים. וברובם יש תרגילים בהם זה אכן קוד, אבל בחומר הלימוד לא מופיעה אפילו שורה אחת.
 

b o n f i r e

New member
מסכים

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