C++ Academy · Pelajaran

Pembenihan yang Betul

Dapatkan kerawakan yang boleh dihasilkan semula

Pelajaran 3 daripada 413 langkah

Pembenihan yang Betul ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah Pembenihan?

seed ialah keadaan permulaan sesebuah enjin. seed yang sama menghasilkan semula jujukan yang sama; seed yang berbeza menghasilkan jujukan yang berbeza.

#include <iostream>
#include <random>

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

Seed Tetap untuk Kebolehulangan

seed yang berterusan menjadikan hasil boleh diulang, iaitu keadaan yang ideal untuk ujian dan penyahpepijatan.

#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

std::random_device menyediakan seed tidak deterministik daripada sistem pengendalian. Gunakannya sekali untuk menetapkan seed enjin anda.

#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 Sekali, Guna Semula

Tetapkan seed enjin sekali sahaja semasa permulaan. Menetapkan seed semula sebelum setiap cabutan merosakkan kualiti kerawakan.

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

Perangkap Seed Berasaskan Masa

Menetapkan seed dengan time(nullptr) hanya berubah sekali setiap saat, jadi atur cara yang dimulakan serentak akan mendapat jujukan yang sama. Utamakan 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;
}

Pembenihan dengan seed_seq

Sesebuah enjin mempunyai banyak keadaan dalaman. std::seed_seq menyebarkan beberapa nilai seed ke seluruh keadaan tersebut untuk pemulaan yang lebih baik.

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

Menggabungkan Nilai random_device

Untuk pembenihan berkualiti tinggi, kumpulkan beberapa nilai daripada random_device ke dalam 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;
}

Menetapkan Seed Semula Secara Eksplisit

Anda boleh menetapkan semula enjin sedia ada dengan seed(value) untuk memulakan semula jujukannya dari titik yang diketahui.

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

Menyimpan dan Memulihkan Keadaan

Keadaan enjin boleh ditulis ke aliran dan dibaca semula, membolehkan anda menyimpan serta menyambung semula keadaan rawak yang tepat.

#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 Tidak Boleh Diulang

Oleh sebab random_device tidak deterministik, jangan gunakannya apabila anda perlu mengulang semula sesuatu larian. Gunakan seed tetap untuk tujuan itu.

#include <iostream>
#include <random>

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

Penjana Boleh Guna Semula

Corak yang biasa ialah membungkus enjin yang telah ditetapkan seed di sebalik pembantu kecil supaya bahagian kod yang lain hanya perlu meminta nombor.

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

Semakan Pantas

Uji pemahaman anda tentang pembenihan.

Ringkasan

Anda telah mempelajari pembenihan yang betul:

  • seed tetap menghasilkan larian yang boleh diulang; std::random_device menghasilkan larian yang unik
  • tetapkan seed sekali semasa permulaan, bukan pada setiap cabutan; elakkan seed time() yang berketepatan rendah
  • seed_seq menyebarkan entropi ke seluruh enjin, dan keadaan enjin boleh disimpan atau dipulihkan melalui aliran

Seterusnya, anda akan menggunakan semua ini dalam contoh praktikal.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Pembenihan yang Betul” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Pembenihan yang Betul”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pembenihan yang Betul”?

Dapatkan kerawakan yang boleh dihasilkan semula Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Pembenihan yang Betul” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Enjin Rawak
  2. Taburan
  3. Pembenihan yang Betul
  4. Contoh Praktikal
← Kembali ke C++ Academy