การแจกแจง
กำหนดรูปแบบผลลัพธ์สุ่ม
การแจกแจง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ