כיצד ליצור מספרים אקראיים ברובי

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

אף מחשב לא יכול לייצר באמת מספרים אקראיים אך ורק על ידי חישוב. הטוב ביותר שהם יכולים לעשות הוא לייצר פסאודורנדום מספרים, שהם רצף של מספרים ש מופיעים אקראיים אך אינם.

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

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

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

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

instagram viewer
זִמָּה בכל מקום בתחילת התוכנית שלך, הוא יפיק סדרה שונה של מספרים אקראיים לכאורה בכל פעם שתפעיל אותה. שיטה זו נקראת באופן מרומז כאשר התוכנית מופעלת, ומזרעת את ה- PRNG עם מזהה הזמן והתהליך (ללא מספר רצף).

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

עם זאת, רובי מקל על הדברים קצת יותר אם אתה משתמש ב- Ruby 1.9.x. ה גרעין # ראנד השיטה יכולה לנקוט בטיעון יחיד. אם טיעון זה הוא א נומרית מכל סוג שהוא, רובי תייצר מספר שלם מ- 0 עד (ולא כולל) אותו מספר.

עם זאת, מה אם אתה רוצה לייצר מספר בין 10 ל -15? בדרך כלל, תייצר מספר בין 0 ל- 5 ותוסיף אותו ל -10. עם זאת, רובי מקל על זה.

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

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

מבחן יחידה שנכשל ברצף אחד אמור להיכשל שוב בפעם הבאה שהוא מופעל, אם הוא יוצר רצף הבדלים בפעם הבאה, יתכן שהוא לא ייכשל. לשם כך התקשרו גרעין # srand עם ערך ידוע וקבוע.

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

עם זאת, מכיוון שתוכניות מצפות שהתוצאה של שיטה זו תהיה אקראית - זו מטרתה! - זה כנראה לעולם לא יהווה בעיה. רק אם התוכנית מצפה לראות רצף מספרים צפוי, למשל אם התקשרה זִמָּה אם יש ערך קבוע, האם עליו לראות תוצאות לא צפויות.

instagram story viewer