مولد الأعداد العشوائية C++
تعلم كيفية توليد أرقام عشوائية بلغة C++ مع أمثلة أكواد تفاعلية. استكشف rand()، srand()، <random> المكتبة، std::uniform_int_distribution، و std::mt19937 مع شروحات مفصلة.
محرر الشيفرة C++
تعلم كيفية توليد أرقام عشوائية بلغة C++ مع أمثلة أكواد تفاعلية. استكشف rand()، srand()، <random> المكتبة، std::uniform_int_distribution، و std::mt19937 مع شروحات مفصلة.
#include <iostream>
#include <random>
int main() {
int min = 1;
int max = 100;
int quantity = 5;
// Modern C++ random number generation
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(min, max);
std::cout << "Modern C++ random numbers:" << std::endl;
for (int i = 0; i < quantity; i++) {
int num = dis(gen);
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
الإنتاج
هذه معاينة في المتصفح وليست تنفيذاً لـ Java أو C++. القيم غير مناسبة للتشفير.
معاينة المثال
C++ الكلاسيكي مع rand()
استخدم دالة rand() التقليدية من <cstdlib> لتوليد أعداد صحيحة عشوائية. بسيطة ومدعومة على نطاق واسع، رغم أنها غير مناسبة للتطبيقات التشفيرية بسبب ضعف جودة العشوائية.
هل تحتاج إلى رقم عشوائي سريع؟
جرب مولد الأرقام العشوائية عبر الإنترنت للحصول على نتائج فورية دون الحاجة لكتابة أي شيفرة.
فهم توليد الأعداد العشوائية في C++
تعتمد خوارزمية rand() على التنفيذ. تفصل أدوات C++11 المحركات مثل std::mt19937 عن التوزيعات؛ ولا تملك التوزيعات محرك mt19937 افتراضياً.
rand() Function
تعتمد خوارزمية rand() على التنفيذ. تفصل أدوات C++11 المحركات مثل std::mt19937 عن التوزيعات؛ ولا تملك التوزيعات محرك mt19937 افتراضياً.
<random> Library
<random> توفر المكتبة (C++11+) توليد أرقام عشوائية حديثة مع std::mt19937 (Mersenne Twister)، وتوزيعات متنوعة مثل uniform_int_distribution، وجودة عشوائية أفضل من rand().
uniform_int_distribution
يوفر std::uniform_int_distribution تحكمًا دقيقًا في نطاقات الأعداد الصحيحة مع توزيع موحد
std::mt19937
تعتمد خوارزمية rand() على التنفيذ. تفصل أدوات C++11 المحركات مثل std::mt19937 عن التوزيعات؛ ولا تملك التوزيعات محرك mt19937 افتراضياً.
حالات الاستخدام الشائعة
الألعاب والمحاكاة
قم بتوليد رميات نرد عشوائية، سحب بطاقات، توليد إجرائي، وأحداث اللعبة باستخدام rand() أو <random> المكتبة الحديثة في حلقات اللعبة والمحاكاة.
الأمن والتشفير
ليس rand() ولا std::mt19937 مولّداً تشفيرياً. للأغراض الأمنية استخدم مكتبة تشفير أو واجهة نظام تشغيل موثّقة؛ لا يقدّم std::random_device ضماناً أمنياً محمولاً بين المنصات.
الحوسبة عالية الأداء
<random> توفر المكتبة الحديثة مع std::mt19937 أداء ممتازا لتوليد كميات كبيرة من الأرقام العشوائية في تطبيقات الحوسبة عالية الأداء والحوسبة العلمية.
اختبار البرمجيات
إنشاء بيانات اختبار عشوائية، ومدخلات اختبار الضباب، والحالات الإضافية لضمان تغطية قوية للشيفرة واكتشاف الأخطاء في تطبيقات C++.
كيف يعمل توليد الأرقام العشوائية ب C++
تعتمد خوارزمية rand() على التنفيذ. تفصل أدوات C++11 المحركات مثل std::mt19937 عن التوزيعات؛ ولا تملك التوزيعات محرك mt19937 افتراضياً.
تعتمد خوارزمية rand() على التنفيذ. تفصل أدوات C++11 المحركات مثل std::mt19937 عن التوزيعات؛ ولا تملك التوزيعات محرك mt19937 افتراضياً.
يعتمد std::random_device على التنفيذ وقد يستخدم محركاً حتمياً. لا يضمن مخرجات غير قابلة للتوقع على كل منصة.
نصائح عملية
تجنب rand() لصالح الكود الجديد
تعتمد خوارزمية rand() على التنفيذ. تفصل أدوات C++11 المحركات مثل std::mt19937 عن التوزيعات؛ ولا تملك التوزيعات محرك mt19937 افتراضياً.
اختيار البذرة صراحةً
تُعيد البذرة الثابتة تسلسل المحرك نفسه. لا تُهيّأ محركات C++ تلقائياً بإنتروبيا النظام؛ اختر البذرة صراحةً عند الحاجة.
استخدم التوزيعات المناسبة
للحصول على نطاقات صحيحة موحدة، استخدم std::uniform_int_distribution. بالنسبة لأرقام الأعداد العائمة، استخدم std::uniform_real_distribution. وهذا يضمن الخصائص الإحصائية المناسبة.
المواصفات الفنية
الخوارزميات
- تعتمد خوارزمية rand() على التنفيذ. تفصل أدوات C++11 المحركات مثل std::mt19937 عن التوزيعات؛ ولا تملك التوزيعات محرك mt19937 افتراضياً.
- تعاصفة ميرسين (تاريخ الميلاد::mt19937)
- يعتمد std::random_device على التنفيذ وقد يستخدم محركاً حتمياً. لا يضمن مخرجات غير قابلة للتوقع على كل منصة.
خصائص الأداء
- rand(): سريع لكن جودة عشوائية ضعيفة
- <random>: سريعة بجودة ممتازة
- std::mt19937: سريع جدًا للكميات الكبيرة
الأسئلة المتداولة
ما هي أساليب C++ التي يتم تناولها؟
الراند الكلاسيكي () مع srand() ومكتبة <random> الحديثة وstd::uniform_int_distribution ومحرك mt19937.
هل يمكنني تخصيص الأمثلة؟
نعم. قم بتعيين الحد الأدنى والحد الأقصى والكمية في لوحة المعلمات وقم بالتشغيل لرؤية المخرجات.
ما هو النهج الموصى به اليوم؟
مكتبة <random> ذات توزيع مسمى ومحرك؛ لا تزال rand() موجودة في التعليمات البرمجية القديمة ولكنها ذات جودة ضعيفة ومزالق في النطاق.
كيف أقوم بزرع المولد؟
يعتمد std::random_device على التنفيذ وقد يستخدم محركاً حتمياً. لا يضمن مخرجات غير قابلة للتوقع على كل منصة.
ما هو النطاق الذي تُرجعه rand() في C++؟
يُرجع rand() قيماً من 0 إلى RAND_MAX مع شمول الطرفين. تحقّق من المنصة: يستخدم Microsoft CRT القيمة 32767؛ وقد يختلف الحد في تنفيذ آخر.
هل rand() آمنة تشفيرياً؟
ليس rand() ولا std::mt19937 مولّداً تشفيرياً. للأغراض الأمنية استخدم مكتبة تشفير أو واجهة نظام تشغيل موثّقة؛ لا يقدّم std::random_device ضماناً أمنياً محمولاً بين المنصات.
كيف أُنشئ أعدادًا عشرية عشوائية في C++؟
اجمع بين std::mt19937 وstd::uniform_real_distribution مضبوطة على النطاق الذي تريده، مثلاً من 0.0 إلى 1.0، ثم استدعِ dist(generator). النتيجة تكون عددًا من النوع double يُشمل حده الأدنى بينما يُستثنى حده الأعلى.
هل rand() آمنة للخيوط في C++؟
تعتمد سلامة rand() بين الخيوط على التنفيذ. استخدم محركاً لكل خيط أو زامن الوصول إلى محرك مشترك.
C++ standard draft: rand / srand · C++ standard draft: random_device · C++ standard draft: uniform_int_distribution
المراجع والموارد
-
C++ <random> Reference - cppreference
المرجع الرسمي لمكتبة توليد الأعداد شبه العشوائية في C++.
-
Mersenne Twister - Wikipedia
خوارزمية Mersenne Twister التي تعتمد عليها معظم مكتبات الأرقام العشوائية في لغات البرمجة.