גילוי מספרים אקראיים

C++:
גילוי מספרים אקראיים

איך לעשות:

להפקת מספרים אקראיים ב-C++, בדרך כלל תשתמש בכותרת <random>, שהוצגה ב-C++11, ומציעה מגוון רחב של אפשרויות להפקת מספרים אקראיים מהפצות שונות.

#include <iostream>
#include <random>

int main() {
    // אתחול מנוע אקראי
    std::random_device rd;  
    std::mt19937 gen(rd()); 

    // הגדרת הטווח [0, 99] כולל
    std::uniform_int_distribution<> distrib(0, 99); 

    // יצירת והדפסת 5 מספרים אקראיים בתוך הטווח המוגדר
    for(int n=0; n<5; ++n)
        std::cout << distrib(gen) << ' ';
    return 0;
}

דוגמת הקוד הזו מאתחלת מחולל מספרים אקראיים מסוג Mersenne Twister עם זרע מ-std::random_device. לאחר מכן, היא מגדירה הפצת מספרים שלמים אחידה בטווח [0, 99] ולבסוף מדפיסה 5 מספרים אקראיים מהפצה זו.

פלט לדוגמה עשוי להיראות כך, אך יש לזכור שכל הפעלה כנראה תפיק תוצאות שונות:

45 67 32 23 88

טבילה עמוקה:

בהיסטוריה, ייצור מספרים אקראיים ב-C++ היה תלוי במידה רבה בפונקציית rand() ופונקציית srand() לשימוש בזרע, הנמצאות בכותרת <cstdlib>. עם זאת, גישה זו נתקלה לעיתים בביקורת על חוסר האחידות והניתנות לחיזוי בהפצת המספרים שנוצרו.

הצגת הכותרת <random> ב-C++11 סימנה שיפור משמעותי, והציעה מערכת מתוחכמת ליצירת מספרים אקראיים. האפשרויות המוצעות כוללות מגוון של מנועים (כמו std::mt19937 עבור Mersenne Twister) והפצות (כמו std::uniform_int_distribution עבור הפצה אחידה של מספרים שלמים) שניתן לשלב כדי לעמוד בצרכים הספציפיים של המתכנת, מה שמוביל להתנהגות יותר צפויה, ביצועים טובים יותר וגמישות רבה יותר.

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