Penyemaian yang Tepat
Dapatkan keacakan yang dapat direproduksi
Penyemaian yang Tepat adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Apa Itu Seed?
seed adalah status awal sebuah mesin. Seed yang sama menghasilkan kembali urutan yang sama; seed yang berbeda menghasilkan urutan yang berbeda.
#include <iostream>
#include <random>
int main() {
std::mt19937 a(100), b(200);
std::cout << std::boolalpha << (a() == b()) << '\n';
return 0;
}Seed Tetap untuk Hasil yang Dapat Diulang
Seed konstan membuat hasil dapat diulang, sehingga ideal untuk pengujian dan penelusuran kesalahan.
#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;
}Perangkat Acak Standar
std::random_device menyediakan seed nondeterministik dari sistem operasi. Gunakan sekali untuk memberikan seed pada mesin 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;
}Berikan Seed Sekali, Gunakan Kembali
Berikan seed pada mesin satu kali saat mulai. Memberikan seed ulang sebelum setiap pengambilan akan merusak kualitas keacakan.
#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;
}Jebakan Seed Berbasis Waktu
Memberikan seed dengan time(nullptr) hanya berubah sekali per detik, sehingga program yang dimulai bersamaan mendapatkan urutan yang sama. Sebaiknya gunakan 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;
}Pemberian Seed dengan Urutan Seed
Sebuah mesin memiliki banyak status internal. std::seed_seq menyebarkan beberapa nilai seed ke seluruh bagian status tersebut untuk inisialisasi 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 dari Perangkat Acak
Untuk pemberian seed berkualitas tinggi, kumpulkan beberapa nilai dari 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;
}Memberikan Seed Ulang Secara Eksplisit
Anda dapat mengatur ulang mesin yang sudah ada dengan seed(value) untuk memulai kembali urutannya 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 Status
Sebuah mesin dapat dialirkan keluar lalu dimasukkan kembali, sehingga Anda dapat menyimpan dan melanjutkan status acak yang persis sama.
#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;
}Perangkat Acak Tidak Dapat Direproduksi
Karena random_device bersifat nondeterministik, jangan pernah menggunakannya ketika Anda perlu mereproduksi suatu proses. Gunakan seed tetap untuk 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;
}Pembangkit yang Dapat Digunakan Kembali
Pola umum membungkus mesin yang telah diberi seed di balik pembantu kecil sehingga bagian kode lainnya cukup meminta angka.
#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;
}Pemeriksaan Singkat
Uji pemahaman Anda tentang pemberian seed.
Ringkasan
Anda telah mempelajari pemberian seed yang benar:
- seed tetap menghasilkan proses yang dapat direproduksi;
std::random_devicemenghasilkan proses yang unik - berikan seed sekali saat mulai, bukan pada setiap pengambilan; hindari seed
time()yang beresolusi kasar seed_seqmenyebarkan entropi ke seluruh mesin, dan status mesin dapat disimpan atau dipulihkan melalui aliran
Selanjutnya, Anda akan menerapkan semua hal ini pada contoh-contoh praktis.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penyemaian yang Tepat” gratis?
Ya — teks lengkap “Penyemaian yang Tepat” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penyemaian yang Tepat”?
Dapatkan keacakan yang dapat direproduksi Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Penyemaian yang Tepat” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mesin Acak
- Distribusi
- Penyemaian yang Tepat
- Contoh Praktis