Thư viện std C++ 11 có một số trình tạo số ngẫu nhiên (RNG), mỗi lần thực hiện khái niệm UniformRandomNumberGenerator. Sau đó, chúng có thể được sử dụng làm đối số cho các bản phân phối ngẫu nhiên, xem thêm this documentation để biết tổng quan.gói (loại xóa) một trình tạo số ngẫu nhiên
Ưu điểm của thiết kế này là sự lựa chọn của động cơ RNG cơ bản là de-coupled từ ứng dụng của nó. Tuy nhiên, thiết kế cũng yêu cầu định nghĩa (không chỉ đơn thuần là các khai báo) của tất cả các cuộc gọi tới RNG để có sẵn (nếu kiểu RNG vẫn không được chỉ định làm tham số mẫu). Như vậy, trong
struct complicated_random_distribution
{
/*
some data and auxiliary methods here
*/
// complicated; may call RNG::operator() many times
template<typename RNG>
some_type operator()(RNG&gen) const;
};
thành viên operator()
không thể được thực hiện thẳng thắn trong một đơn vị biên soạn riêng biệt (CU), nhưng phải có sẵn trong file header cùng (hoặc một #include
d từ nó).
Để thực hiện riêng biệt, một cách lý tưởng sẽ muốn có cách nào đó để đóng gói RNG theo cách giống như std::function<>
gói bất kỳ đối tượng có thể gọi nào. (Chỉ cần sử dụng std::function
và cung cấp các giá trị cho RNG::min()
và RNG::max()
làm đối số cho hàm được xác định trong CU riêng biệt là hạn chế và sẽ không cho phép sử dụng, ví dụ: std::uniform_real_distribution<>
bên trong).
Làm cách nào để thực hiện điều này? Các triển khai cho tính năng này có sẵn không? Thư viện std sẽ cung cấp thư viện này trong tương lai? Hay tôi sau một cá trích đỏ?
Sửa máy phát điện số ngẫu nhiên được yêu cầu phải có static
thành viên min()
và max()
, làm kiểu tẩy xoá cứng hoặc không thể (libstdc GNU của ++ không làm cho giả thiết này và một loại tẩy xoá với các thành viên không tĩnh min()
và max()
hoạt động, nhưng không phải với libC++ của LLVM, sử dụng tiêu chuẩn yêu cầu static
thành viên). Có cách nào để giải quyết vấn đề này không? Nếu không, điều này có nghĩa là chuẩn C++ có giao diện bị hỏng cho các trình tạo số ngẫu nhiên không?
Bạn có thể dễ dàng thực hiện điều đó ra khỏi dòng, định nghĩa chỉ cần có trong file header. Điều đó thực sự rất tệ? –
Cụm từ bạn đang tìm kiếm là "loại xóa", không phải "gói". Ngoài ra, bạn sẽ xử lý 'min()' và 'max()' như thế nào? Tất cả URNG có cùng phạm vi không? Tôi giả sử không? – Barry
@Walter Bạn chắc chắn có thể: http://coliru.stacked-crooked.com/a/47941423fc589739 Vâng, có lẽ chúng ta đang nói về những thứ khác nhau. –