2014-12-31 16 views
8

Tôi muốn có thể lưu và tải trạng thái của RNG để tôi có thể tái tạo các giá trị ngẫu nhiên giống nhau từ một điểm nhất định (lưu ứng dụng/ảnh chụp).C++ std :: mt19937 và trạng thái rng lưu/tải & tính di động

Tôi thấy có một toán tử < < và >> quá tải, dường như lưu vào chuỗi dưới dạng chuỗi số.

  • Đó có phải là cách tốt nhất/duy nhất để lưu không? Tôi sẽ không nhớ chỉ có giá trị trạng thái nhị phân cố định kích thước không phải là điều chuỗi ký tự cách nhau mà sau đó tôi cần tiền tố hoặc đặt dấu phân cách xung quanh cho định dạng tệp của tôi.
  • Đây có phải là tất cả di động không? ví dụ. Tôi có thể chuyển đổi giữa các phiên bản trình biên dịch khác nhau hay thậm chí giữa MSVC và GCC để tạo ra cùng một tập dữ liệu cho các bản phân phối được định cấu hình (với một sai số nhỏ trong trường hợp dấu phẩy động và chính xác cho phép toán số nguyên) không?

Trả lời

3

Có, operator<<operator>> là cách duy nhất để nhập hoặc xuất trạng thái của trình tạo số ngẫu nhiên. Bạn có thể dễ dàng chuyển đổi biểu diễn văn bản sang và từ nhị phân, nếu bạn muốn.

Hủy tuần tự hóa và tuần tự hóa mt19937 trạng thái nên phải di động giữa các lần triển khai. Kết quả của việc đọc và viết trạng thái của động cơ thông qua các toán tử trực tuyến cũng được xác định bởi tiêu chuẩn, miễn là bạn đảm bảo các luồng được thấm nhuần cùng một ngôn ngữ.

Xem § 26.5.1.5 cho các yêu cầu của operator<<operator>>, tiếp theo § 26.5.3.2 cho các đại diện văn bản của mersenne_twister_engine, mà mt19937 là một typedef được xác định rõ về.

0

Trên đầu trang của các câu trả lời trước:

  • xuất khẩu đại diện văn bản qua op < < sẽ chỉ lưu bang RNG thích hợp nếu nó được đọc lại qua op >> sử dụng locale cùng. Thay đổi ngôn ngữ sẽ gây ra sự cố

  • lựa chọn default_random_engine được xác định thực hiện. Nó là một typedef, nhưng nó được phép được thiết lập cho các công cụ thực tế khác nhau trên các nền tảng khác nhau (§ 26.5.5). Do đó, sử dụng op < < và op >> để lưu/khôi phục lại trạng thái cấm sử dụng công cụ mặc định

  • trong khi máy phát điện được chỉ định khá nghiêm ngặt, tôi không tin phân phối được yêu cầu giống nhau giữa các nền tảng. Tiết kiệm nhà nước có thể không giúp bạn nhiều với lặp lại ở đây

Tôi muốn giới thiệu để có tài liệu này tiện dụng, chỉ trong trường hợp http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

+0

OK, dường như các thuật toán phân phối là thực hiện được xác định, vì vậy sẽ phải nguồn của riêng tôi ... Vì vậy, đó là một ngôn ngữ chung của họ được sửa chữa hoàn toàn để dễ dàng áp dụng cho luồng (ví dụ: std :: stringstream)? Có lẽ tôi sẽ phải quay trở lại Boost.Random mặc dù tôi nghĩ rằng chỉ có điều này gây phiền nhiễu dòng là tốt. –

+0

@FireLancer có, bạn có thể thấm nhuần miền địa phương trước khi mở/ra, xem http://www.cplusplus.com/reference/ios/ios/imbue/ –

Các vấn đề liên quan