הפעם הראשונה שמספרים אקראיים נשכו אותי הייתה בפרויקט צדדי של Laravel שנים לפני שהתחלתי לבנות את Toolz.dev. הייתי צריך קודי הפניה קצרים, שהגיעו אליהם rand() כי זה היה ממש שם, ושלח אותו שבוע לאחר מכן לשני משתמשים היה אותו קוד לא בגלל שהסיכויים היו אסטרונומיים, אלא בגלל שלא הבנתי מה rand() למעשה הבטיח. כי מבוכה קטנה לימדה אותי לקח יש לי נשא לתוך כל כלי על Toolz.dev: "random" הוא לא דבר אחד יש אקראי מזדמן כי הוא בסדר עבור הטלת קוביות, ויש אקראי רציני אתה צריך את הרגע ערך שומר כל דבר.
המדריך הזה הוא הגרסה הארוכה של מה שהלוואי שמישהו היה אומר לי אז אני אעבור על איך ליצור מספרים אקראיים עם ה מחולל מספרים אקראיים על Toolz.dev, כאשר ערכות ייחודיות בלבד חשובות, מדוע מקור האקראיות משנה את מה שאתה יכול להשתמש בבטחה בפלט עבורו, ואת המקרים המעשיים שבהם אני מושיט יד אליו בזמן הבנייה.
TL;DR: מחולל מספרים אקראיים שואב ערכים מטווח שאתה מגדיר הגדר מינימום ומקסימום, בחר כמה מספרים אתה רוצה, ובחר מספרים שלמים או עשרוניים הפעל ייחודי-בלבד כאשר אין ערך עשוי לחזור, וזה מה שאתה רוצה עבור הגרלות, הגרלות, ודגימה ללא החלפה מחולל Toolz.dev פועל כולו בדפדפן שלך ומעדיף את ה - API של קריפטו אינטרנט עבור האקראיות שלו, כך ששום דבר שאתה מייצר לעולם לא עוזב את המכשיר שלך.
מה בעצם עושה מחולל מספרים אקראיים?
מחולל מספרים אקראיים ממפה מקור בלתי צפוי של ביטים לטווח זה כל העבודה בדפדפן המקור שחשוב הוא crypto.getRandomValues(), שה-API של Web Cryptography דורש להיות חזק מבחינה קריפטוגרפית - בניגוד Math.random(), מה שלא מבטיח הבטחה כזו אתה אומר לו את המרווח, נגיד 1 עד 100, והוא מחזיר ערך מתוך אותו מרווח שבו, באופן אידיאלי, לכל ערך יש סיכוי שווה להופיע בקש יותר מאחד והוא חוזר על ההגרלה.
החלק המעניין הוא המילה " בלתי צפוי," כי מחשבים הם מכונות דטרמיניסטיות שאינן מייצרות הפתעה באופן טבעי מה שהם מייצרים זה פסאודו-אקראיות: רצף שנראה אקראי ועובר מבחנים סטטיסטיים אבל נוצר על ידי אלגוריתם מזרע התחלתי תן לאותו אלגוריתם את אותו זרע ואתה מקבל את אותו רצף בכל פעם. יכולת השחזור היא תכונה כאשר אתה כותב מבחן שצריך לחזור עליו, ואחריות כאשר אתה מטביע משהו שחייב להיות בלתי ניתן לניחוש.
על Toolz.dev המחולל יושב בדפדפן וקורא את הסיביות שלו מ crypto.getRandomValues כאשר הדפדפן חושף אותו, מה שכל דפדפן מודרני עושה פונקציה זו מוגדרת על ידי W3C Web Cryptography API והוא מגובה על ידי מערכת ההפעלה & #39;s מקור מאובטח קריפטוגרפית כאשר מקור זה קיים, המספרים הם בלתי צפויים מספיק עבור עבודה צמודה אבטחה כמו איסוף אסימונים או דשדוש חפיסה כאשר הוא איכשהו לא זמין, הכלי נופל בחזרה למחולל JavaScript הסטנדרטי, וזה בסדר למשחקים ודגימה אבל אף פעם לא צריך זרע שום דבר סודי לדעת באיזה משני העולמות האלה אתה נמצא הוא הדבר החשוב ביותר בשימוש בכל RNG באר.
כיצד אוכל ליצור מספרים אקראיים ב-Toolz.dev?
הזרימה קצרה בכוונה כי רוב הזמן אתה רק רוצה מספר ואתה רוצה אותו עכשיו.
ראשית, הגדר את הטווח הזן את המינימום והמקסימום עבור מספרים שלמים הטווח כולל בשני הקצוות, כך ש-1 עד 6 יכול להחזיר כל אחד מ-1, 2, 3, 4, 5 או 6, בדיוק כמו קובייה ערכים וטווחים שליליים שמתפרשים על אפס, כגון -50 עד 50, פועלים באותו אופן.
שנית, בחר כמה מספרים אתה רוצה מספר אחד לבחירה מהירה, או אצווה של עד עשרת אלפים כאשר אתה זריעה נתוני בדיקה או בניית מדגם.
שלישית, בחר את האפשרויות השאר " מספרים שלמים בלבד" פועל עבור מספרים שלמים, או כבה אותו והגדר את מספר המקומות העשרוניים כאשר אתה צריך ערכי שברים. הפעל את " ערכים ייחודיים בלבד" כאשר אף מספר אינו יכול לחזור.
לבסוף, לחץ על צור התוצאה מציגה את הרשימה יחד עם הסכום והממוצע, ואת כל עותקי האצווה כרשימה מופרדת בשורה חדשה כך שהיא יורדת ישר לעמודה של גיליון אלקטרוני, סקריפט או מתקן בדיקה אם השתמשת ב מחולל UUID או ה מחולל סיסמא על Toolz.dev, הצורה של זה ירגיש מוכר, כי אני מנסה לשמור על הגנרטורים עקבי.
מתי עלי להשתמש במספרים ייחודיים בלבד?
זו האפשרות שאנשים מפספסים, והיא זו שמשנה הכי הרבה את המתמטיקה.
כברירת מחדל המחולל מצייר עם החלפה כל הגרלה היא עצמאית, כך שמספר יכול להופיע יותר מפעם אחת באותה אצווה זה נכון להטלת קוביות, כי זוג קוביות אמיתי יכול בהחלט להגיע לשתי רביעיות אבל זה לא בסדר להגרלת לוטו, הגרלה, או כל פעם שאתה בוחר דגימה מבלי להחזיר את האסימון לשקית.
הפעל ייחודי-בלבד והגנרטור מושך ללא החלפה הוא שומר תיעוד של מה שהוא כבר הפיק ומדלג על חזרות עד שהוא מילא את האצווה שלך השימוש הקלאסי הוא מספרי לוטו: אם אתה רוצה שישה מספרים מ-1 עד 49 ללא כפילויות, ייחודי-בלבד הוא ההבדל בין כרטיס תקף לכרטיס שבור.
יש כאן גבול טבעי, והכלי מכבד את זה אתה לא יכול לצייר מספרים שלמים ייחודיים יותר ממה שהטווח יכול להחזיק תבקש עשרה מספרים ייחודיים בין 1 ל-5 ואין תשובה תקפה, כי רק חמישה מספרים שלמים נפרדים קיימים במרווח הזה במקום להסתובב לנצח בניסיון למצוא ערך שישי בלתי אפשרי, המחולל עוצר ואומר לך שהטווח קטן מדי בניתי את השומר הזה בכוונה לאחר שצפיתי ביותר מדי לולאות דשדוש נאיביות תלויות בקוד הייצור.
מספרים שלמים או עשרוניים: מה אני צריך?
מספרים שלמים מכסים את רוב הבקשות קוביות, כדורי לוטו, מדדי מערך וספירת רשומות הם כולם מספרים שלמים, ומצב מספרים שלמים נותן לך טווח כולל שמתאים לאופן שבו אנשים חושבים על הדברים האלה.
עשרוניות מיועדות לכמויות רציפות: מחיר אקראי, קריאת חיישן מדומה, משקל, הסתברות. כבה מצב מספר שלם והכלי שואב מהמרווח החצי פתוח הכולל את המינימום אך לא את המקסימום. אותה מוסכמה חצי פתוחה, מינימום כלול ומקסימום לא נכלל, היא אותה מוסכמה שעומדת בבסיס כמעט כל RNG של נקודה צפה בכל שפה, כולל JavaScript' משלו Math.random, שמחזיר ערך בטווח שבין 0 עד אבל לא כולל 1. התאמת המוסכמה הזו פירושה שהמספרים שאתה מקבל כאן מתנהגים כמו המספרים שהיית מקבל בקוד.
אתה גם שולט במספר המקומות העשרוניים, מאחד עד עשר. שני מקומות מתאימים לערכים דמויי מטבע, יותר כאשר אתה מדמה מדידות שצריכות רזולוציה עדינה יותר. זכור שכמעט תמיד ניתן לספק את המרחב של עשרונים מובהקים בלבד מכיוון שהמרחב של עשרונים ברורים הוא עצום, בעוד שטווח ייחודי בלבד בתוספת טווח שלם זעיר הוא המקום שבו אתה פוגע בקיר שתואר לעיל.
כמה אקראי הוא "אקראי מספיק"?
הנה הטבלה שהלוואי שהייתי רואה לפני אותו אירוע קוד הפניה. זה ממפה את מקרי השימוש הנפוצים לסוג האקראיות שהם דורשים בפועל.
| מקרה שימוש | דרושה אקראיות | חזרות מותרות? | הערות |
|---|---|---|---|
| קוביות, משחקי לוח | פסאודו-אקראי זה בסדר | כן | עצמאות לגלגול היא הנקודה |
| בחירת מנצח אקראי | מועדף קריפטוגרפי | לא (ייחודי בלבד) | ענייני הגינות, השתמש בייחודי בלבד |
| מספרי הגרלה או הגרלה | מועדף קריפטוגרפי | לא (ייחודי בלבד) | לצייר ללא תחליף |
| שורות דגימה לניתוח | פסאודו-אקראי זה בסדר | בדרך כלל לא | ייחודי בלבד לדגימה ללא החלפה |
| מתקני בדיקת זריעה | פסאודו-אקראי זה בסדר | כן | יכולת שחזור יכולה אפילו להיות רצויה |
| אסימוני אבטחה, סודות | נדרש קריפטוגרפי | לא | לעולם אל תשתמש כאן ב-PRNG רגיל |
השורה שמעידה אנשים היא "אסימוני אבטחה." RNG למטרות כלליות, אפילו טוב, אינו תחליף למחולל סודי ייעודי. אם אתה יוצר מפתח API, אסימון הפעלה או סיסמה, השתמש בכלי המיועד לעבודה זו, כמו ה מחולל סיסמא, או כלי גיבוב כמו ה מחולל Hash כאשר אתה צריך תקציר באורך קבוע מחולל המספרים האקראיים מיועד למספרים בטווח, לא לחומר מפתח קריפטוגרפי, והמסגור הכנה של הגבול הזה שימושי יותר מאשר להעמיד פנים שכלי אחד עושה הכל.
מה אני יכול לבנות איתו בעצם?
כמה מהדרכים שבהן זה מרוויח את מקומו בזרימת העבודה שלי.
כשאני בודק ממשק משתמש שמעבד רשימות, אני מייצר אצווה של כמה מאות מספרים כדי לעמוד בכמויות, מחירים או ציונים, מדביק אותם לתוך מתקן, ופתאום הפריסה מופעלת במגוון ריאליסטי במקום אותם שלושה שורות מוקלדות ביד לעבודה בוורדפרס ב-WP Adminify השתמשתי בערכים אקראיים כדי לאכלס תוכן הדגמה כך שמסך הגדרות נראה חי בצילום מסך.
כאשר לקוח מפעיל מתנה, מצב ייחודי בלבד בוחר זוכים בצורה הוגנת מתוך רשימה ממוספרת של משתתפים הקצה לכל משתתף מספר, צייר כמה זוכים ייחודיים שיש פרסים, בוצע אין נוסחת גיליון אלקטרוני, אין ויכוח אם ההגרלה זויפה, כי המספרים הגיעו ממקור שאף אחד מאיתנו לא שולט בו.
לאינטואיציה סטטיסטית מהירה, יצירת אצווה גדולה והצצה בסכום ובממוצע היא בדיקת שפיות מהירה שהטווח וההתפלגות מתנהגים. אם אני מבקש מספרים מ-1 עד 100 והממוצע חוזר קרוב ל-50, העולם הוא כצפוי.
ולדברים היומיומיים, זה גלגלת קוביות, הטלת מטבע כשאתה מתייחס ל-1 ו-2 כאל ראשים וזנבות, ו-"בחר מספר" מתנחל ויכוחים קטנים. לא כל שימוש צריך להיות רציני כדי להיות שימושי.
איך זה בהשוואה לכתיבה משלך?
יכולת לכתוב Math.floor(Math.random() * (max - min + 1)) + min ותסיים כתבתי את השורה הזאת אלף פעמים אז למה להושיט יד לכלי?
שתי סיבות, שתיהן למדו בדרך הקשה הראשונה היא הטעויות הלא-אחת והטיה מודולו שמתגנבות למתמטיקה של טווח מגולגל ביד, במיוחד ברגע שמוסיפים את הגבול הכולל מול הבלעדי ואת הדרישה הייחודית בלבד הכלי מטפל במקרי הקצה, כולל ה-" ביקשת ערכים ייחודיים יותר מאשר exist" מקרה, אז אתה לא מגלה אותם מחדש ב-2 לפנות בוקר. השני הוא ש Math.random במפורש אינו מאובטח קריפטוגרפית, עובדה שתיעוד MDN מציין בבירור, וקל לשכוח שכאשר אתה מדביק קטע לקוד שמאוחר יותר שומר על משהו אמיתי. מחולל Toolz.dev כברירת מחדל למקור הקריפטו, כך שההתנהגות הבטוחה יותר היא זו שאתה מקבל מבלי לחשוב על זה.
עבור מספר חד פעמי בסביבה שאתה שולט, קטע הוא בסדר. עבור ציורים חוזרים, סטים ייחודיים, אצוות שאתה רוצה להעתיק, או כל דבר שבו אתה רוצה את מקור הקריפטו כברירת מחדל, הכלי שומר את החלקים המטופשים.
אם העבודה שלך נוטה יותר לקידוד ועיצוב מאשר יצירת מספרים, אותה פילוסופיה בצד הלקוח עוברת דרך שאר ארגז הכלים, מה- לורם איפסום מחולל לטקסט מציין מיקום לקבוצה הרחבה יותר המכוסה ב- כלי פרודוקטיביות למפתחים מדריך. ובגלל שכל אחד מאלה פועל באופן מקומי, ה פרטיות נתונים הסיפור זהה בכולם: התשומות שלך נשארות בדפדפן שלך.
מהן הטעויות הנפוצות שאנשים עושים עם מספרים אקראיים?
לאחר שנים של סקירת קוד, שלי ואנשים אחרים's, אותו קומץ של טעויות מופיעות שוב ושוב, ושווה לתת להן שמות כדי שתוכל להימנע מהן.
הראשון מבלבל " unlikely" עם "impossible." סיפור קוד ההפניה שלי הוא בדיוק זה. כשאתה מצייר עם החלפה מטווח, התנגשויות אינן באג, הן ודאות סטטיסטית בהינתן מספיק הגרלות. פרדוקס יום ההולדת הוא ההמחשה הקלאסית: בקבוצה של 23 אנשים בלבד הסיכוי של שניים לחלוק יום הולדת הוא מעל 50 אחוז, גבוה בהרבה ממה שהאינטואיציה מציעה, כי אתה משווה כל זוג, לא משווה את כולם לתאריך קבוע אחד. אם הערכים שלך חייבים להיות ייחודיים, אל תקווה שהטווח גדול מספיק. הפעל ייחודי בלבד והסר את הספק.
השני הוא להגיע למקור הלא נכון. שפע של מדריכים מציגים נוסחת טווח שנבנתה עליה Math.random ולעולם אל תזכיר שזה לא מתאים לשום דבר רגיש לאבטחה הערך נראה אקראי, ההדגמה עובדת וההרגל נדבק ואז מישהו מעתיק את הקטע הזה לקוד שיוצר אסימון לאיפוס סיסמה, ועכשיו את "random" האסימון ניתן לחיזוי לכל מי שמבין את האלגוריתם הבסיסי הכלל בוטה: אם אדם לעולם לא יוכל לנחש את הערך, הוא צריך מקור קריפטוגרפי מחולל Toolz.dev ברירת מחדל למקור זה, שהוא ברירת המחדל הבטוחה יותר לבנות הרגל סביבו.
השלישי הוא שגיאות off-by-one בגבולות הטווח. נקודות קצה כוללניות לעומת בלעדיות מעידות אפילו מפתחים מנוסים, כי שפות שונות ופונקציות שונות עושות בחירות שונות. האם 100 הוא פלט אפשרי כשאני מבקש 1 עד 100? עבור מספרים שלמים כאן, כן, שני הקצוות כלולים. עבור עשרוניות המקסימום אינו נכלל, תואם את מוסכמות הנקודה הצפה. להיות מפורש לגבי איזו מוסכמה חלה מונע את הבאג השקט שבו הקוביות שלך לעולם לא מטילות שש כי כתבת < max במקום <= max.
הרביעי הוא בהנחה מדגם קטן נראה אקראי אקראיות אמיתית מייצרת גושים ופסים הפוך מטבע הוגן עשר פעמים ו ריצה של ארבעה ראשים היא נורמלית לחלוטין, ובכל זאת אנשים רואים את זה ומניחים המטבע, או המחולל, שבור אקראיות היא לא זהה אפילו מרווח אם אתה רוצה ערכים מרווחים באופן שווה, אתה לא רוצה מחולל מספרים אקראיים בכלל, אתה רוצה רצף לדעת איזה מהם אתה בעצם צריך הוא חצי הקרב.
שאלות נפוצות
איך פועל מחולל מספרים אקראיים?
מחולל מספרים אקראיים ממפה מקור בלתי צפוי של ביטים לטווח שתבחר כלי זה קורא בתים מ-Web Crypto API כאשר הוא זמין ומשנה אותם למרווח המינימום למקסימום שלך, כך שלכל ערך בטווח יש סיכוי שווה להיגרר.
האם המספרים באמת אקראיים?
הם מספרים פסאודו אקראיים חזקים מבחינה קריפטוגרפית, שאינם ניתנים לחיזוי לכל המטרות המעשיות. כאשר הדפדפן חושף crypto.getRandomValues הפלט מתאים לאסימונים ולדשדוש; אם רק המחולל הסטנדרטי זמין, הערכים עדיין מפוזרים היטב אך אין להשתמש בהם לסודות.
כיצד אוכל ליצור מספרים אקראיים ייחודיים ללא חזרות?
הפעל את האפשרות ייחודית-בלבד לפני יצירת הכלי ואז מצייר ללא החלפה, כך כל מספר באצווה הוא שונה אם אתה מבקש יותר מספרים שלמים ייחודיים מאשר הטווח יכול להחזיק, זה אומר לך במקום לולאה לנצח.
האם זה יכול ליצור מספרים עשרוניים?
כן כבו את האפשרות מספר שלם וקבעו כמה מקומות עשרוניים אתם רוצים עשרוניות נמשכות מהמרווח חצי פתוח הכולל את המינימום אך לא את המקסימום, שהוא המוסכמה הסטנדרטית לטווחים רציפים.
האם אני יכול להשתמש במספרים שליליים?
כן. הזן מינימום שלילי, מקסימום שלילי או טווח המשתרע על אפס, כגון -50 עד 50. המחולל מטפל בטווחים שליליים ומעורבים באותו אופן שבו הוא מטפל בטווחים חיוביים.
כמה מספרים אני יכול לייצר בבת אחת?
עד 10,000 מספרים לכל אצווה התוצאה כוללת את הסכום והממוצע כך שתוכל לבדוק את השפיות של אצוות גדולות במבט חטוף, וכל הרשימה מעתיקה כערכים מופרדים בשורה חדשה.
האם מחולל המספרים האקראיים הזה חינמי ופרטי?
כן. זה בחינם ללא הרשמה וללא מכסה שימוש, וכל מספר נוצר בדפדפן שלך. אף טווח, ספירה או תוצאה לא מועברים לשרת.
לשם מה אני יכול להשתמש במחולל מספרים אקראיים?
שימושים נפוצים כוללים בחירת מספרי הגרלה או הגרלה, הטלת קוביות למשחקים, בחירת זוכה אקראי, זריעת נתוני בדיקות, דגימת שורות לניתוח, ואקראיות של סדר רשימה מצב ייחודי בלבד מכסה כל מקרה שצריך דגימה ללא חזרות.



