التهيئة ببذرة بطريقة صحيحة
احصل على عشوائية قابلة لإعادة الإنتاج
التهيئة ببذرة بطريقة صحيحة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما المقصود بالتهيئة بالبذرة؟
البذرة هي الحالة الابتدائية للمولّد. تنتج البذرة نفسها التسلسل نفسه، بينما تنتج البذرة المختلفة تسلسلًا مختلفًا.
#include <iostream>
#include <random>
int main() {
std::mt19937 a(100), b(200);
std::cout << std::boolalpha << (a() == b()) << '\n';
return 0;
}بذرة ثابتة لضمان قابلية إعادة الإنتاج
تجعل البذرة الثابتة النتائج قابلة للتكرار، ولذلك فهي مثالية للاختبارات وتصحيح الأخطاء.
#include <iostream>
#include <random>
int main() {
auto run = [](unsigned s) {
std::mt19937 g(s);
return g() % 1000;
};
std::cout << run(42) << ' ' << run(42) << '\n';
return 0;
}std::random_device
يوفّر std::random_device بذورًا غير حتمية من نظام التشغيل. استخدمه مرة واحدة لتهيئة المولّد بالبذرة.
#include <iostream>
#include <random>
int main() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> d(1, 6);
std::cout << "a roll: " << d(gen) << '\n';
return 0;
}تهيئة مرة واحدة ثم إعادة الاستخدام
هيّئ المولّد بالبذرة مرة واحدة فقط عند بدء التشغيل. تؤدي إعادة التهيئة بالبذرة قبل كل سحب إلى إضعاف جودة العشوائية.
#include <iostream>
#include <random>
int main() {
std::random_device rd;
std::mt19937 gen(rd()); // seed once
std::uniform_int_distribution<int> d(1, 100);
for (int i = 0; i < 3; ++i) std::cout << d(gen) << ' ';
std::cout << '\n';
return 0;
}مشكلة استخدام الوقت كبذرة
لا تتغير التهيئة باستخدام time(nullptr) إلا مرة واحدة كل ثانية، ولذلك تحصل البرامج التي تبدأ معًا على التسلسل نفسه. يُفضّل استخدام random_device.
#include <iostream>
#include <random>
#include <ctime>
int main() {
std::mt19937 gen(static_cast<unsigned>(std::time(nullptr)));
std::cout << "seeded from time (coarse)\n";
std::cout << (gen() % 100) << '\n';
return 0;
}التهيئة باستخدام seed_seq
يمتلك المولّد قدرًا كبيرًا من الحالة الداخلية. يوزّع std::seed_seq عدة قيم للبذور على هذه الحالة بالكامل لتحسين التهيئة.
#include <iostream>
#include <random>
int main() {
std::seed_seq seq{1, 2, 3, 4};
std::mt19937 gen(seq);
std::cout << (gen() % 1000) << '\n';
return 0;
}دمج قيم random_device
للحصول على تهيئة عالية الجودة، اجمع عدة قيم من random_device داخل seed_seq.
#include <iostream>
#include <random>
#include <array>
int main() {
std::random_device rd;
std::array<unsigned, 4> seeds{rd(), rd(), rd(), rd()};
std::seed_seq seq(seeds.begin(), seeds.end());
std::mt19937 gen(seq);
std::cout << "well-seeded engine ready\n";
std::cout << (gen() % 100) << '\n';
return 0;
}إعادة التهيئة بالبذرة صراحةً
يمكنك إعادة ضبط مولّد موجود باستخدام seed(value) لإعادة بدء تسلسله من نقطة معروفة.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(1);
unsigned first = gen();
gen.seed(1); // restart
std::cout << std::boolalpha << (gen() == first) << '\n';
return 0;
}حفظ الحالة واستعادتها
يمكن إرسال المولّد إلى دفق ثم قراءته منه مجددًا، مما يتيح حفظ حالة عشوائية دقيقة واستئنافها.
#include <iostream>
#include <sstream>
#include <random>
int main() {
std::mt19937 gen(5);
std::ostringstream save; save << gen;
unsigned expected = gen();
std::istringstream load(save.str());
std::mt19937 restored; load >> restored;
std::cout << std::boolalpha << (restored() == expected) << '\n';
return 0;
}random_device غير قابل لإعادة الإنتاج
نظرًا إلى أن random_device غير حتمي، فلا تستخدمه عندما تحتاج إلى إعادة إنتاج عملية تشغيل. استخدم بذرة ثابتة لهذا الغرض.
#include <iostream>
#include <random>
int main() {
const unsigned FIXED = 2026;
std::mt19937 gen(FIXED); // reproducible across runs
std::cout << (gen() % 10000) << '\n';
return 0;
}مولّد قابل لإعادة الاستخدام
من الأنماط الشائعة إخفاء مولّد مهيأ بالبذرة خلف دالة مساعدة صغيرة، بحيث يطلب باقي البرنامج الأرقام فقط.
#include <iostream>
#include <random>
int roll(std::mt19937& gen) {
std::uniform_int_distribution<int> d(1, 6);
return d(gen);
}
int main() {
std::mt19937 gen(2026);
std::cout << roll(gen) << ' ' << roll(gen) << '\n';
return 0;
}تحقق سريع
اختبر مدى فهمك للتهيئة بالبذور.
مراجعة
تعلّمت التهيئة الصحيحة بالبذور:
- تمنح البذرة الثابتة عمليات تشغيل قابلة لإعادة الإنتاج، بينما تمنح
std::random_deviceعمليات تشغيل مختلفة - هيّئ المولّد بالبذرة مرة واحدة عند بدء التشغيل، لا قبل كل سحب؛ وتجنّب البذرة الخشنة المستندة إلى
time() - يوزّع
seed_seqالإنتروبيا على المولّد، ويمكن حفظ حالة المولّد واستعادتها عبر الدفقات
بعد ذلك، ستطبّق كل ما تعلّمته على أمثلة عملية.
الأسئلة الشائعة
هل درس «التهيئة ببذرة بطريقة صحيحة» مجاني؟
نعم — نص درس «التهيئة ببذرة بطريقة صحيحة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «التهيئة ببذرة بطريقة صحيحة»؟
احصل على عشوائية قابلة لإعادة الإنتاج تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التهيئة ببذرة بطريقة صحيحة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المولّدات العشوائية
- التوزيعات
- التهيئة ببذرة بطريقة صحيحة
- أمثلة عملية