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()
, חשוב לציין שהפקת מספרים אמיתית לגמרי – במיוחד לצורכים קריפטוגרפיים – עדיין מסתמכת על שיקולים נוספים. ליישומים קריפטוגרפיים, יש להשתמש בספריות שתוכננו במיוחד לבטיחות, שלעיתים קרובות מנצלות מקורות אנטרופיה חומרתיים במקום זאת.