2012-11-27 23 views
18

Ví dụ: nếu tôi khởi tạo một số std::mt19937 với cùng một hạt giống và thông số theo GCC và dưới MSVC, tôi có nhận được cùng một chuỗi các số ngẫu nhiên không? Nếu vậy tôi giả định tài sản này sẽ giữ cho mersenne_twister_engine nói chung kể từ mt19937 chỉ là một với các thông số cụ thể. Điều này là không đúng cho rand() trong C. Có vẻ như các tài liệu tiêu chuẩn các biến đổi được áp dụng trong điều khoản của mã cụ thể, vì vậy tôi nghi ngờ nó nên luôn luôn giống nhau, nhưng ma quỷ là trong các chi tiết ...Chuẩn C++ 11 có đảm bảo các số ngẫu nhiên giống hệt nhau cho cùng một hạt giống trên các triển khai không?

+0

Các cách triển khai khác nhau của 'rand' sử dụng các hằng số khác nhau để chúng không bao giờ khớp. Wikipedia chứa danh sách hữu ích: http://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use –

+0

@MarkRansom: Các triển khai khác nhau được phép sử dụng các thuật toán hoàn toàn khác nhau cho rand(), hằng số tồn tại. –

+0

"Được phép sử dụng", chắc chắn. Trong thực tế, tất cả chúng dường như giống nhau. –

Trả lời

20

Đối với các công cụ số ngẫu nhiên mới, có, cho cùng một hạt giống và các thông số bạn sẽ nhận được cùng một chuỗi các giá trị trên tất cả các nền tảng. Đối với rand(), không. Bạn cũng không có đảm bảo đó với các bản phân phối số ngẫu nhiên, ngay cả khi chúng được nạp cùng một chuỗi các giá trị đầu vào.

+2

Ngoài ra các bản phân phối không được đảm bảo để tạo ra các giá trị giống nhau, do đó việc kết hợp động cơ với phân phối sẽ không cho kết quả giống nhau trên các nền tảng. – bames53

+0

Chuẩn C, 7.22.2.2/2 "Hàm srand sử dụng đối số như một hạt giống cho một chuỗi các số giả ngẫu nhiên mới được trả về bởi các lệnh gọi tiếp theo đến rand. Nếu srand sau đó được gọi với cùng giá trị hạt giống, chuỗi của các số giả ngẫu nhiên phải được lặp lại. Nếu rand được gọi trước khi bất kỳ cuộc gọi nào đến srand đã được thực hiện, cùng một chuỗi sẽ được tạo ra khi srand được gọi đầu tiên với giá trị hạt giống là 1. " Làm thế nào mà không phải là một sự bảo đảm? – rici

+0

Ngoài ra, với C++, sự hiểu biết của tôi là toán tử == trên hai máy phát, bộ điều hợp hoặc phân phối sẽ là iff đúng, chúng sẽ tạo ra các chuỗi vô hạn giống nhau, vì vậy có thể có được sự đảm bảo nếu tồn tại. – rici

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