0Pricing
C++ Academy · درس

التوزيعات

شكّل المخرجات العشوائية

التوزيعات درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

وظيفة التوزيعات

تربط التوزيعة البتات الخام للمحرك بقيم ذات شكل ونطاق مرغوبين. وتستدعونها مع المحرك باعتباره وسيطًا.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(1);
    std::uniform_int_distribution<int> dist(1, 100);
    std::cout << "value: " << dist(gen) << '\n';
    return 0;
}

توزيع الأعداد الصحيحة بالتساوي

تعيد std::uniform_int_distribution<int>(a, b) أعدادًا صحيحة ضمن النطاق الشامل [a, b]، بحيث تكون احتمالية كل منها متساوية.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(5);
    std::uniform_int_distribution<int> die(1, 6);
    for (int i = 0; i < 5; ++i) std::cout << die(gen) << ' ';
    std::cout << '\n';
    return 0;
}

توزيع الأعداد الحقيقية بالتساوي

يعطي std::uniform_real_distribution<double>(a, b) قيمًا بالفاصلة العائمة ضمن [a, b)، وهو مفيد لتمثيل الاحتمالات.

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(3);
    std::uniform_real_distribution<double> dist(0.0, 1.0);
    std::cout << std::fixed << std::setprecision(3) << dist(gen) << '\n';
    return 0;
}

توزيع برنولي

يعيد std::bernoulli_distribution(p) القيمة true باحتمال p، لنمذجة رمية عملة منحازة.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(8);
    std::bernoulli_distribution coin(0.5);
    for (int i = 0; i < 5; ++i) std::cout << (coin(gen) ? 'H' : 'T');
    std::cout << '\n';
    return 0;
}

التوزيع الطبيعي

ينتج std::normal_distribution<double>(mean, stddev) منحنى جرسيًا تتجمع قيمه حول المتوسط.

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(11);
    std::normal_distribution<double> dist(100.0, 15.0);
    std::cout << std::fixed << std::setprecision(1) << dist(gen) << '\n';
    return 0;
}

إعادة استخدام التوزيعة

استدعاء التوزيعات المتكرر قليل التكلفة. أنشئوا توزيعة واحدة واستدعُوها داخل حلقة باستخدام المحرك نفسه.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(20);
    std::uniform_int_distribution<int> d(1, 3);
    int counts[4] = {0};
    for (int i = 0; i < 12; ++i) counts[d(gen)]++;
    std::cout << counts[1] << ' ' << counts[2] << ' ' << counts[3] << '\n';
    return 0;
}

توزيع بواسون

يمثّل std::poisson_distribution<int>(mean) أعداد الأحداث النادرة، مثل عدد مرات الوصول في الدقيقة.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(30);
    std::poisson_distribution<int> dist(4.0);
    for (int i = 0; i < 5; ++i) std::cout << dist(gen) << ' ';
    std::cout << '\n';
    return 0;
}

معلمات التوزيع

يمكنك الاستعلام عن معلمات التوزيع باستخدام دوال الوصول مثل a() أو b() أو mean() أو stddev().

#include <iostream>
#include <random>

int main() {
    std::uniform_int_distribution<int> d(10, 50);
    std::cout << "range: " << d.a() << " to " << d.b() << '\n';
    return 0;
}

إعادة ضبط حالة التوزيع

تخزّن بعض التوزيعات، مثل normal، حالة داخلية مؤقتًا. تعمل reset() على مسحها، بحيث تعتمد القيمة التالية على المولّد وحده.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(40);
    std::normal_distribution<double> dist(0.0, 1.0);
    dist(gen);
    dist.reset();
    std::cout << "distribution state reset\n";
    return 0;
}

اختيار عنصر عشوائي

لاختيار فهرس عشوائي في مصفوفة، استخدم uniform_int_distribution على النطاق من 0 إلى size - 1.

#include <iostream>
#include <random>
#include <string>

int main() {
    std::string colors[] = {"red", "green", "blue"};
    std::mt19937 gen(50);
    std::uniform_int_distribution<int> pick(0, 2);
    std::cout << colors[pick(gen)] << '\n';
    return 0;
}

تقدير π

تُشغّل التوزيعات أساليب مونت كارلو. ويتيح أخذ عينات من نقاط عشوائية داخل مربع تقدير قيمة π.

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(60);
    std::uniform_real_distribution<double> u(0.0, 1.0);
    int inside = 0, n = 10000;
    for (int i = 0; i < n; ++i) {
        double x = u(gen), y = u(gen);
        if (x * x + y * y <= 1.0) ++inside;
    }
    std::cout << std::fixed << std::setprecision(2) << 4.0 * inside / n << '\n';
    return 0;
}

تحقق سريع

اختبر مدى فهمك لنطاقات التوزيعات.

مراجعة

تعلّمت التوزيعات التالية:

  • تشكّل مخرجات المولّد: uniform_int (شامل للحدين)، وuniform_real ([a,b))، وbernoulli، وnormal، وpoisson
  • استدعها مع المولّد، مثل dist(gen)، وأعد استخدامها داخل الحلقات
  • تتيح اختيار العناصر وإجراء تقديرات مونت كارلو

بعد ذلك، ستتعلّم تهيئة المولّدات بالبذور بطريقة صحيحة.

الأسئلة الشائعة

هل درس «التوزيعات» مجاني؟

نعم — نص درس «التوزيعات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «التوزيعات»؟

شكّل المخرجات العشوائية تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «التوزيعات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. المولّدات العشوائية
  2. التوزيعات
  3. التهيئة ببذرة بطريقة صحيحة
  4. أمثلة عملية
← العودة إلى C++ Academy