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

การตั้งค่าเมล็ดอย่างถูกต้อง

สร้างความสุ่มที่ทำซ้ำได้

การตั้งค่าเมล็ดอย่างถูกต้อง เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

การตั้งค่า seed คืออะไร

seed คือสถานะเริ่มต้นของตัวสร้าง หากใช้ seed เดิม จะได้ลำดับเดิมซ้ำอีกครั้ง ส่วน seed ที่ต่างกันจะให้ลำดับที่ต่างกัน

#include <iostream>
#include <random>

int main() {
    std::mt19937 a(100), b(200);
    std::cout << std::boolalpha << (a() == b()) << '\n';
    return 0;
}

การใช้ seed คงที่เพื่อให้ทำซ้ำได้

การใช้ seed คงที่ทำให้ผลลัพธ์ทำซ้ำได้ จึงเหมาะอย่างยิ่งสำหรับการทดสอบและการแก้ไขข้อบกพร่อง

#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 ให้ค่า seed แบบไม่กำหนดแน่นอนจากระบบปฏิบัติการ ควรใช้เพียงครั้งเดียวเพื่อตั้งค่าให้ตัวสร้าง

#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;
}

ตั้งค่า seed ครั้งเดียวแล้วใช้ซ้ำ

ตั้งค่า seed ให้ตัวสร้างเพียงครั้งเดียวเมื่อเริ่มต้นโปรแกรม การตั้งค่า seed ใหม่ก่อนการสุ่มแต่ละครั้งจะทำให้คุณภาพความสุ่มลดลง

#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;
}

ข้อผิดพลาดจากการใช้เวลาเป็น seed

การตั้งค่า seed ด้วย 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 ด้วยลำดับค่าเริ่มต้น

ตัวสร้างมีสถานะภายในจำนวนมาก std::seed_seq จะกระจายค่า seed หลายค่าไปทั่วสถานะทั้งหมด เพื่อให้การเริ่มต้นทำได้ดียิ่งขึ้น

#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;
}

การรวมค่าจากอุปกรณ์สุ่ม

หากต้องการตั้งค่า seed คุณภาพสูง ให้รวบรวมค่าหลายค่าจาก 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 ใหม่อย่างชัดเจน

คุณสามารถรีเซ็ตตัวสร้างที่มีอยู่ด้วย 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 ไม่ได้กำหนดผลลัพธ์ตายตัว จึงไม่ควรใช้เมื่อจำเป็นต้องทำให้การทำงานซ้ำได้ ในกรณีนั้นให้ใช้ seed คงที่

#include <iostream>
#include <random>

int main() {
    const unsigned FIXED = 2026;
    std::mt19937 gen(FIXED); // reproducible across runs
    std::cout << (gen() % 10000) << '\n';
    return 0;
}

ตัวสร้างที่นำกลับมาใช้ซ้ำได้

รูปแบบที่ใช้กันทั่วไปคือห่อตัวสร้างที่ตั้งค่า seed แล้วไว้เบื้องหลังตัวช่วยขนาดเล็ก เพื่อให้ส่วนอื่นของโค้ดเพียงขอค่าตัวเลขได้

#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;
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับการตั้งค่า seed

สรุปทบทวน

คุณได้เรียนรู้การตั้งค่า seed ที่ถูกต้องดังนี้

  • seed คงที่ทำให้การทำงานซ้ำได้ ส่วน std::random_device ให้ลำดับที่ไม่ซ้ำกัน
  • ตั้งค่า seed ครั้งเดียวเมื่อเริ่มต้นโปรแกรม ไม่ใช่ก่อนการสุ่มแต่ละครั้ง และหลีกเลี่ยง seed จาก time() ที่มีความละเอียดต่ำ
  • seed_seq กระจายเอนโทรปีไปทั่วตัวสร้าง และสามารถบันทึกหรือคืนค่าสถานะของตัวสร้างผ่านกระแสข้อมูลได้

ถัดไป คุณจะนำแนวคิดทั้งหมดนี้ไปใช้กับตัวอย่างที่นำไปใช้จริง

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

บทเรียน “การตั้งค่าเมล็ดอย่างถูกต้อง” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การตั้งค่าเมล็ดอย่างถูกต้อง”

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

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

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

บทเรียน “การตั้งค่าเมล็ดอย่างถูกต้อง” ใช้เวลานานแค่ไหน

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

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

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

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

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