Pembenihan yang Betul
Dapatkan kerawakan yang boleh dihasilkan semula
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_devicemenghasilkan larian yang unik - tetapkan seed sekali semasa permulaan, bukan pada setiap cabutan; elakkan seed
time()yang berketepatan rendah seed_seqmenyebarkan entropi ke seluruh enjin, dan keadaan enjin boleh disimpan atau dipulihkan melalui aliran
Seterusnya, anda akan menggunakan semua ini dalam contoh praktikal.
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
- Enjin Rawak
- Taburan
- Pembenihan yang Betul
- Contoh Praktikal