Misalkan Anda ingin menggunakan <random>
fasilitas C ++ dalam program praktis (untuk beberapa definisi "praktis" - kendala di sini adalah bagian dari pertanyaan ini). Anda memiliki kode yang kira-kira seperti ini:
int main(int argc, char **argv) {
int seed = get_user_provided_seed_value(argc, argv);
if (seed == 0) seed = std::random_device()();
ENGINE g(seed); // TODO: proper seeding?
go_on_and_use(g);
}
Pertanyaan saya adalah, untuk tipe apa Anda harus menggunakannya ENGINE
?
Saya dulu selalu mengatakan
std::mt19937
karena itu cepat untuk mengetik dan memiliki pengenalan nama. Tapi hari ini sepertinya semua orang mengatakan bahwa Mersenne Twister sangat berat dan tidak bersahabat dan bahkan tidak lulus semua tes statistik yang dilakukan orang lain.Saya ingin mengatakan
std::default_random_engine
karena ini adalah "standar" yang jelas. Tetapi saya tidak tahu apakah itu bervariasi dari satu platform ke platform lainnya, dan saya tidak tahu apakah ini baik secara statistik.Karena semua orang ada di platform 64-bit hari ini, haruskah kita setidaknya menggunakan
std::mt19937_64
lebihstd::mt19937
?Saya ingin mengatakan
pcg64
atauxoroshiro128
karena mereka tampaknya dihormati dan ringan, tetapi mereka tidak ada<random>
sama sekali.Aku tidak tahu apa-apa tentang
minstd_rand
,minstd_rand0
,ranlux24
,knuth_b
, dll - pasti mereka harus baik untuk sesuatu?
Jelas ada beberapa kendala yang bersaing di sini.
Kekuatan mesin. (
<random>
tidak memiliki PRNG yang kuat secara kriptografis, tetapi masih, beberapa yang terstandarisasi "lebih lemah" daripada yang lain, kan?)sizeof
mesin.Kecepatannya
operator()
.Kemudahan penyemaian.
mt19937
sangat sulit untuk diunggulkan dengan benar karena memiliki begitu banyak kondisi untuk diinisialisasi.Portabilitas antara vendor perpustakaan. Jika satu vendor
foo_engine
menghasilkan angka yang berbeda dari vendor lainfoo_engine
, itu tidak baik untuk beberapa aplikasi. (Semoga ini tidak mengesampingkan apa pun kecuali mungkindefault_random_engine
.)
Menimbang semua kendala ini sebaik mungkin, apa yang akan Anda katakan adalah jawaban "praktik terbaik yang ada di perpustakaan"? Haruskah saya terus menggunakan std::mt19937
, atau apa?