C++ Academy · บทเรียน

การแจกแจง

กำหนดรูปแบบผลลัพธ์สุ่ม

บทเรียน 2 จาก 413 ขั้นตอน

การแจกแจง เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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;
}

การรีเซ็ตสถานะของการแจกแจง

การแจกแจงบางชนิด เช่น การแจกแจงปกติ จะเก็บสถานะภายในไว้ในแคช 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;
}

การเลือกสมาชิกแบบสุ่ม

หากต้องการเลือกดัชนีของอาร์เรย์แบบสุ่ม ให้ใช้การแจกแจงจำนวนเต็มแบบสม่ำเสมอในช่วงตั้งแต่ 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) และนำกลับมาใช้ซ้ำในลูป
  • การแจกแจงช่วยให้เลือกสมาชิกและประมาณค่าด้วยวิธีมอนติคาร์โลได้

ถัดไป คุณจะได้เรียนรู้วิธีตั้งค่า seed ให้กับตัวสร้างอย่างถูกต้อง

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

คำถามที่พบบ่อย

บทเรียน “การแจกแจง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแจกแจง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแจกแจง”

กำหนดรูปแบบผลลัพธ์สุ่ม คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การแจกแจง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เครื่องมือสร้างตัวเลขสุ่ม
  2. การแจกแจง
  3. การตั้งค่าเมล็ดอย่างถูกต้อง
  4. ตัวอย่างการใช้งานจริง
← กลับไปที่ C++ Academy