2014-07-03 20 views
7

Tại sao kết quả phân phối chuẩn không bắt buộc phải nhất quán giữa các lần triển khai? Kết quả của các trình tạo số ngẫu nhiên giả mặt khác được uỷ quyền giống hệt nhau.stl phân phối ngẫu nhiên và tính di động

Ví dụ: phần sau sẽ gần như chắc chắn in một cái gì đó khác nhau cho mọi triển khai thư viện chuẩn khác nhau.

std::mt19937 random {100}; 
std::normal_distribution<> dist; 

std::cout << dist(random); 

Giả sử tôi muốn tạo thủ tục và muốn giống hệt nhau để tạo ra kết quả giống nhau trên nền tảng và trình biên dịch. Tôi không thể làm điều đó với stl. Tôi phải "thoái lui" để sử dụng boost. Tại sao đây không phải là một khiếm khuyết?

+1

Đây không phải là câu trả lời, đó chỉ là điều cần suy nghĩ. Đối với nhiều bản phân phối, có nhiều cách để có được các giá trị mong muốn. Phân phối bình thường có thể sử dụng phép biến đổi hộp-muller, hoặc một hàm lỗi (đệ quy hoặc mở rộng bằng tay). Cả hai hàm sử dụng này đều sử dụng các hàm khác (chẳng hạn như cosin, sin, logarit, hàm lỗi, tích phân, căn bậc hai ...). Thật khó để nói phương pháp nào là tốt nhất (thời gian so vớichính xác) và có thể được tối ưu hóa tốt nhất. Có lẽ trong C++ 14 khi mọi người trở nên quen thuộc hơn với các bản phân phối và triển khai này, một tiêu chuẩn sẽ được thực thi. – druckermanly

+0

Ồ, và thậm chí biến đổi hộp-muller có triển khai khác nhau (cực, cartesian). Tấn cách để tấn vui vẻ? – druckermanly

+0

@ user2899162 bạn thực sự có lý do chính xác, tôi trích dẫn đề xuất trong câu trả lời của tôi. –

Trả lời

11

Đây không phải là lỗi, nó là do thiết kế. Lý do cho điều này có thể được tìm thấy trong A Proposal to Add an Extensible Random Number Facility to the Standard Library (N1398) mà nói (tôi nhấn mạnh ):

Mặt khác, các thông số kỹ thuật cho các nhà phân phối duy nhất xác định kết quả thống kê, không phải là thuật toán chính xác để sử dụng. khác với động cơ, vì các thuật toán phân phối, bằng chứng nghiêm ngặt về tính chính xác của chúng có sẵn, thường theo điều kiện tiên quyết rằng các số ngẫu nhiên đầu vào (thực tế) thống nhất được phân phối. Ví dụ: có ít nhất một số thuật toán được biết để tạo số ngẫu nhiên được phân phối bình thường từ thống nhất số được phân phối. Điều nào hiệu quả nhất phụ thuộc vào tốc độ ít nhất là tốc độ thực thi tương đối cho các chức năng siêu việt, bộ nhớ cache và hành vi dự đoán nhánh của CPU và sử dụng bộ nhớ mong muốn. Do đó, đề xuất này để lại lựa chọn của thuật toán để triển khai. Nó theo sau các chuỗi đầu ra cho các bản phân phối sẽ không giống nhau giữa các lần triển khai. Đó là dự kiến ​​triển khai sẽ lựa chọn cẩn thận các thuật toán cho các phân phối phía trước, vì nó chắc chắn gây ngạc nhiên cho khách hàng nếu một số phân phối tạo ra các số khác nhau từ một phiên bản thực hiện .

điểm này được khẳng định trong việc thực hiện phần định nghĩa mà nói:

Các thuật toán làm thế nào để tạo ra các bản phân phối khác nhau được quy định như thực hiện xác định, bởi vì có rất nhiều dạng thuật toán nổi tiếng cho mỗi phân phối. Mỗi kênh có một sự khác biệt về giao dịch về tốc độ, thích ứng với kiến ​​trúc máy tính gần đây và sử dụng bộ nhớ . Việc thực hiện được yêu cầu để ghi lại sự lựa chọn của mình để mà người dùng có thể đánh giá xem liệu nó có chấp nhận được chất lượng khôn ngoan hay không.

+0

đáng yêu; do đó, nếu tính nhất quán trong việc triển khai là điều quan trọng thì phải đi theo con đường của các thư viện không chuẩn. Cảm ơn trích đoạn có liên quan từ đề xuất. – Brandon

+0

@ Brandon đó là tất cả những gì tôi có thể tìm thấy, do đó, nó trông giống như nó. Bạn luôn có thể đưa điều này lên trên [ISO C++ Standard - Discussion] (https://groups.google.com/a/isocpp.org/forum/?fromgroups#!forum/std-discussion) và xem có một số phòng không để thay đổi. –

+0

không phải là một ý tưởng tồi. Một cái gì đó giống như một sự lựa chọn giữa nhanh và ổn định sẽ là tốt đẹp; không giống như những gì được thực hiện trong (mặc dù một chút lộn xộn). Cảm ơn một lần nữa. – Brandon

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