เครื่องมือสร้างตัวเลขสุ่ม
สร้างบิตสุ่ม
เครื่องมือสร้างตัวเลขสุ่ม เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้การสุ่ม
rand() แบบเก่ามีคุณภาพต่ำและควบคุมได้ยาก ไลบรารี <random> แบ่งการสุ่มออกเป็นตัวสร้าง (แหล่งของบิตสุ่ม) และการแจกแจง (รูปแบบของข้อมูลออก)
#include <iostream>
#include <random>
int main() {
std::mt19937 engine(42);
std::cout << "engine produced a value\n";
unsigned int v = engine();
std::cout << (v != 0 ? "non-zero" : "zero") << '\n';
return 0;
}เมอร์แซนน์ทวิสเตอร์
std::mt19937 เป็นตัวสร้างที่ใช้กันมากที่สุด โดยทำงานเร็ว มีคุณภาพสูง และมีคาบยาว ตัวเลขดังกล่าวคือขนาดสถานะของมันในหน่วยบิต
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(1);
unsigned int a = gen();
unsigned int b = gen();
std::cout << (a != b ? "two different values" : "same") << '\n';
return 0;
}ตัวสร้างมีความแน่นอน
เมื่อใช้เมล็ดสุ่มเดียวกัน ตัวสร้างจะสร้างลำดับเดิมเสมอ ซึ่งทำให้สามารถสร้างผลลัพธ์ซ้ำได้
#include <iostream>
#include <random>
int main() {
std::mt19937 a(123), b(123);
std::cout << std::boolalpha << (a() == b()) << '\n';
std::cout << (a() == b()) << '\n';
return 0;
}การเรียกใช้ตัวสร้าง
ตัวสร้างเป็นสิ่งที่เรียกใช้ได้ การเรียกแต่ละครั้งด้วย engine() จะคืนค่าจำนวนเต็มสุ่มดิบถัดไปในช่วงของมัน
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(7);
for (int i = 0; i < 3; ++i) {
unsigned int v = gen();
std::cout << (v % 100) << ' ';
}
std::cout << '\n';
return 0;
}ช่วงค่าของตัวสร้าง
min() และ max() จะรายงานช่วงค่าดิบที่ตัวสร้างสามารถส่งออกได้
#include <iostream>
#include <random>
int main() {
std::mt19937 gen;
std::cout << "min: " << gen.min() << '\n';
std::cout << "max: " << gen.max() << '\n';
return 0;
}ตัวสร้างอื่น ๆ
ไลบรารีมีตัวสร้างหลายแบบ:
minstd_rand: ตัวสร้างแบบสอดคล้องเชิงเส้นขนาดเล็กmt19937: ตัวสร้างเอนกประสงค์ที่ใช้เป็นค่าเริ่มต้นranlux48: คุณภาพสูงกว่าแต่ช้ากว่า
#include <iostream>
#include <random>
int main() {
std::minstd_rand lcg(5);
std::mt19937 mt(5);
std::cout << (lcg() % 10) << ' ' << (mt() % 10) << '\n';
return 0;
}ตัวสร้าง 64 บิต
ใช้ std::mt19937_64 เมื่อต้องการค่าสุ่มขนาด 64 บิต เช่น สำหรับแฮชขนาดใหญ่หรือช่วงค่าที่กว้างมาก
#include <iostream>
#include <random>
int main() {
std::mt19937_64 gen(99);
unsigned long long v = gen();
std::cout << "got a 64-bit value: " << (v != 0 ? "yes" : "no") << '\n';
return 0;
}ตัวสร้างเทียบกับการแจกแจง
ข้อมูลออกดิบจากตัวสร้างมีการกระจายสม่ำเสมอทั่วช่วงขนาดใหญ่ หากต้องการค่าที่ใช้งานได้ เช่น ผลการทอยลูกเต๋า ให้ส่งตัวสร้างเข้าไปในการแจกแจง
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(2024);
std::uniform_int_distribution<int> die(1, 6);
std::cout << "rolled " << die(gen) << '\n';
return 0;
}การ discard ค่า
discard(n) จะเลื่อนตัวสร้างไปข้างหน้าจำนวน n ขั้นโดยไม่สร้างข้อมูลออก ซึ่งเหมาะสำหรับการข้ามไปยังตำแหน่งถัดไปของลำดับ
#include <iostream>
#include <random>
int main() {
std::mt19937 a(10), b(10);
b.discard(2);
a(); a();
std::cout << std::boolalpha << (a() == b()) << '\n';
return 0;
}การใช้ตัวสร้างเดียวซ้ำ
สร้างตัวสร้างเพียงตัวเดียวและนำกลับมาใช้กับการสุ่มทั้งหมดในโปรแกรม การสร้างตัวสร้างใหม่ทุกครั้งสิ้นเปลืองและอาจลดคุณภาพของการสุ่ม
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(2026);
std::uniform_int_distribution<int> d10(1, 10);
int total = 0;
for (int i = 0; i < 5; ++i) total += d10(gen);
std::cout << "sum of 5 rolls: " << total << '\n';
return 0;
}ข้อผิดพลาดจากเมล็ดสุ่มเริ่มต้น
ตัวสร้างที่สร้างโดยไม่มีค่าเริ่มต้นจะใช้เมล็ดสุ่มเริ่มต้นแบบคงที่ จึงสร้างลำดับเดิมในการทำงานทุกครั้ง คุณต้องกำหนดเมล็ดสุ่มให้มันเพื่อให้ได้ความหลากหลายอย่างแท้จริง (จะกล่าวถึงในบทเรียนถัดไป)
#include <iostream>
#include <random>
int main() {
std::mt19937 gen; // default seed: same every run
std::cout << "first value mod 1000: " << (gen() % 1000) << '\n';
return 0;
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับตัวสร้างแบบสุ่ม
ทบทวน
คุณได้เรียนรู้เกี่ยวกับตัวสร้างแบบสุ่มดังนี้:
<random>แยกตัวสร้าง (บิต) ออกจากการแจกแจง (รูปแบบ)std::mt19937เป็นตัวสร้างหลักที่ใช้กันทั่วไป และมีความแน่นอนเมื่อใช้เมล็ดสุ่มที่กำหนด- ใช้ตัวสร้างเดียวซ้ำและกำหนดเมล็ดสุ่มอย่างเหมาะสมเพื่อให้ได้ความหลากหลายอย่างแท้จริง
ถัดไป คุณจะได้กำหนดรูปแบบข้อมูลออกของตัวสร้างด้วยการแจกแจง
คำถามที่พบบ่อย
บทเรียน “เครื่องมือสร้างตัวเลขสุ่ม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เครื่องมือสร้างตัวเลขสุ่ม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เครื่องมือสร้างตัวเลขสุ่ม”
สร้างบิตสุ่ม คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เครื่องมือสร้างตัวเลขสุ่ม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เครื่องมือสร้างตัวเลขสุ่ม
- การแจกแจง
- การตั้งค่าเมล็ดอย่างถูกต้อง
- ตัวอย่างการใช้งานจริง