Giả sử bạn muốn sử dụng <random>
các tiện ích C ++ trong một chương trình thực tế (đối với một số định nghĩa về "thực tế" - các ràng buộc ở đây là một phần của câu hỏi này). Bạn đã có mã đại khái như thế này:
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);
}
Câu hỏi của tôi là, bạn nên sử dụng loại ENGINE
nào?
Tôi thường nói
std::mt19937
vì nó gõ nhanh và nhận dạng tên. Nhưng ngày nay, dường như mọi người đều nói rằng Mersenne Twister rất nặng và không thân thiện với bộ nhớ cache và thậm chí không vượt qua tất cả các bài kiểm tra thống kê mà người khác làm.Tôi muốn nói
std::default_random_engine
vì đó là "mặc định" rõ ràng. Nhưng tôi không biết nếu nó thay đổi từ nền tảng này sang nền tảng khác và tôi không biết liệu nó có tốt về mặt thống kê hay không.Kể từ khi tất cả mọi người trên một nền tảng 64-bit những ngày này, chúng ta nên ít nhất được sử dụng
std::mt19937_64
trênstd::mt19937
?Tôi muốn nói
pcg64
hoặcxoroshiro128
bởi vì họ có vẻ được tôn trọng và nhẹ, nhưng họ hoàn toàn không tồn<random>
tại.Tôi không biết gì về
minstd_rand
,minstd_rand0
,ranlux24
,knuth_b
, vv - chắc chắn họ phải có tốt cho cái gì?
Rõ ràng có một số hạn chế cạnh tranh ở đây.
Sức mạnh của động cơ. (
<random>
không có PRNG mã hóa mạnh, nhưng vẫn có một số PRNG được tiêu chuẩn hóa "yếu" hơn các loại khác, phải không?)sizeof
động cơ.Tốc độ của nó
operator()
.Dễ gieo hạt.
mt19937
nổi tiếng là khó để gieo hạt đúng cách vì nó có quá nhiều trạng thái để khởi tạo.Tính di động giữa các nhà cung cấp thư viện. Nếu một nhà cung cấp
foo_engine
tạo ra các số khác nhau từ một nhà cung cấp khácfoo_engine
, điều đó không tốt cho một số ứng dụng. (Hy vọng rằng quy tắc này không có gì ngoại trừ có thểdefault_random_engine
.)
Cân nhắc tất cả những ràng buộc này một cách tốt nhất có thể, bạn sẽ nói gì là câu trả lời "thực hành tốt nhất trong thư viện tiêu chuẩn" cuối cùng? Tôi chỉ nên tiếp tục sử dụng std::mt19937
, hoặc những gì?