עבור לתוכן

איך אני יוצר פונקציה ליצירת מספר אקראי?

Featured Replies

פורסם

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

פורסם

שעון המערכת של המחשב

פורסם

שעון המערכת של המחשב הוא ממש לא אקראי.

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

רוב שפות התכנות מממשות רנדום באמצעות אלגוריתם (לא מדויק לקרוא לזה ככה, אבל אין לי שם יותר טוב) בשם LCG:

http://en.wikipedia.org/wiki/Lcg

פורסם

news Flash

האלגוריתמים האלה משתמשים בשעון המערכת ::)

מספרים פסאודו-אקראיים

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

פורסם

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

כשכן מדובר באבטחת מידע, בדר"כ משתמשים בקלט שונה (או שילוב של קלטים שונים), כמו תזמון של הקשות המשתמש, תנועות עכבר, משאבי מערכת ואפילו רעש ממקרופון)

אלגוריתם פשוט נקרא linear shift register שמייצר stream פסאודו-רנדומלי של ביטים.

לוקחים מערך בינארי ובוחרים חלק מהתאים בו (בצורה שרירותית).

מאתחלים את המערך עם ה- seed.

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

צריך לשים לב שיש צירופים מסוימים של "בחירות של המערך" ו- seeds שייתנו לך סדרה גרועה מאוד (או אפילו קבועה)

פורסם

What he said.

השאלה היא למה אתה צריך מספרים אקראיים.

אם זה סתם בשביל להגריל קוביות בשש-בש, מספיק לך LCG עם seed מהשעון.

במקרה של אבטחת מידע, תרצה משהו יותר רציני.

פורסם

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

איפה בדיוק פה הסתירה עם מה שאמרתי? ::)

העובדה היא שכשאתה עושה randomize בכל שפת תיכנות שהיא היא משתמשת בשעון המערכת נקודה.

ובשביל אבטחת מידע משתמשים היום ב-public key

פורסם

ממה שאתה אמרת אפשר להבין שמשתמשים בשעון בלבד על מנת ליצור מספרים אקראיים... מה שלא ממש נכון.

וחוץ מזה, randomize ב-C לא טוען אוטומטית מהשעון, זה פשוט נהוג לתת לו להיטען מהשעון.

ובשביל אבטחת מידע משתמשים היום ב-public key

זה ממש לא קשור.

public key לא משמש ליצירת מספרים אקראיים.

פורסם

ממה שאתה אמרת אפשר להבין שמשתמשים בשעון בלבד על מנת ליצור מספרים אקראיים... מה שלא ממש נכון.

הבן אדם שאל על מה זה מתבסס.

עניתי לו תשובה קצרה ולעניין.

זה שאתה מתחיל לפרש אותה לכל מיני כיוונים זאת לא בעיה שלי

public key לא משמש ליצירת מספרים אקראיים.

:bash: איפה אמרתי שכן??

דיברתם על אבטחת מידע אז זאת שיטת ההצפנה הטובה ביותר

פורסם

זה כמו שישאלו אותך איך פועלת מכונית, ותגיד שהיא פועלת באמצעות דלק.

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

דיברתם על אבטחת מידע אז זאת שיטת ההצפנה הטובה ביותר

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

פורסם

זה כמו שישאלו אותך איך פועלת מכונית, ותגיד שהיא פועלת באמצעות דלק.

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

אויייש אתה חייב להפסיק לדבר על דברים שאתה לא מבין בהם.

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

פורסם

קיימים הרבה (עשרות, מאות, אלפים...) אלגוריתמים ליצירת מספרים אקראיים, כשהנפוץ בהם הוא ה-LCG.

(תואר כאן גם אלגוריתם בסיסי אחר בשם Linear Shift Register)

ולכל אחד יש הרבה דרכים לטעון.

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

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

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

אם מישהו ישאל אותי על איזה עיקרון פועל מנוע של מכונית אני יגיד "שריפת דלק"

אתה יכול לומר את זה, אבל זו תשובה כל כך פשטנית שהיא כמעט לא אומרת כלום.

פורסם

איזה שטויות

אי אפשר להבין ממה שאמרתי שכל מה שצריך זה לקחת מהשעון ואם הבנת את זה ככה אז יש לך בעיה בהבנת הנקרא.

הוא שאל על מה זה מתבסס ועל זה עניתי.

אם הוא היה שואל איך עושים מספר רנדומלי בשפת תיכנות הייתי אומר לו לכתוב rnd/random/וכו..

פורסם

אבל זה לא מה שהוא שאל :)

הוא שאל איך יוצרים פונקציה ליצירת מספרים אקראיים.

ודרך אגב,

אל תאמר לי להפסיק לדבר על נושאים שאני לא מבין בהם

כי אני מבין בנושא יותר ממה שאתה חושב...

פורסם

הוא גם שאל על מה היא מתבססת ועל זה עניתי

עכשיו אולי מספיק לטחון מים?

ארכיון

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

דיונים חדשים