מספרים רנדומליים

arielii

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

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

1ca1

New member
יש לך פונקציה למציאת רנדום?

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

arielii

New member
אם אני בודק כפילות

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

vinney

Well-known member
אפשר לעשות את זה בO של 1 (אבל במחיר זכרון)

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

johnny d

New member
בתיאוריה או משהו מעשי

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

1ca1

New member
../images/Emo128.gif מרחב המאורעות עבור אלגוריתם כזה הוא סופי

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

yossiea

New member
כפילות לא מצביעה בהכרח על גנרטור לקוי

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

yossiea

New member
צריך לציין כמובן מודולו.

הכוונה היא, למשל אם נריץ לולאה עם 2 בחזקת i עבור i=1,2,...,108 מודולו 109, אז בערך כ-30 התוצאות הראשונות יהיו אקראיים (מדומים כמובן, לא ממש אבל לפחות לא בסדר רציף) ומובטח שלא יהיו חזרות. אפשר לנסות עם ראשוני גדול יותר ועם יוצר אחר על אותו רעיון.
 

1ca1

New member
מה זאת אומרת?

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

choo

Active member
דומני שאינך זוכר את הרעיון של אקראיות

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

yaeerk

New member
יאללה מכות!

מוטב שכולם יקראו את זה קודם: http://en.wikipedia.org/wiki/Pseudorandom_number_generator במקום שכל אחד יכתוב את החלק שהוא זוכר ממה שלמד.
 

yossiea

New member
מצטער

מבלי לפגוע, אתה מדבר על אורביטה ועל מסלולים על תרנגולות ועל ביצים ואפילו על יונים (מקווה שלא שכחתי כלום). אבל לא הבנתי אף מילה. אולי אתה מפספס כאן את רעיון האקראיות אז כמו שהציעו כדי שתחזור ותרענן את זכרונך לגבי המושג הזה. לגבי הרעיון שהצעתי הרצתי בדיקה קטנה אצלי במחשב ויצא לא רע. עם ראשוני 659 ועם היוצר 2 קיבלתי מחזור נאה של 658 מספרים אף לא אחד מהם חוזר על עצמו. אז אני חושב שזה בהחלט עונה על הדרישה שלו במיוחד שהוא יכול לחזק את הראנדומליות על ידי בחירת ראשוני אקראי, חיפוש יוצר (מלאכה פשוטה) ואז להשמיד אותו. כמובן ממש לא מומלץ לשימוש ביישומים קריפטוגרפיים (כי הבעיה של ניחוש המספר הבא מצטמצמת לניחוש ראשוני בסדר גודל כזה ואין הרבה כאלו בטווח הזה) אבל אולי בשבילו זה בסדר גמור, ראה דוגמא.
int a[660]; for(int i = 1; i < 659; i++) { a = SquareAndMultiply(2, i, 659); }
 
למעלה