2016-11-01 15 views
30

Có cách nào để đạt được cùng một chuỗi số ngẫu nhiên trong hệ điều hành khác nhau với cùng một hạt giống không? Tôi đã thử mã này:Đạt được chuỗi số ngẫu nhiên giống nhau trên hệ điều hành khác nhau với cùng một hạt giống

std::default_random_engine engine(seed); 
std::uniform_int_distribution<int> dist(0, N-1); 

Nếu tôi chạy mã này trên một máy nhiều lần với cùng một giống, chuỗi các dist (động cơ) là như nhau, nhưng trên chuỗi hệ điều hành khác nhau là khác nhau.

+6

Vì 'std :: default_random_engine' không phải là cùng một PNRG trên mỗi hệ thống, sử dụng' std :: mt19937'. –

+2

Tôi tin rằng một công cụ ngẫu nhiên cụ thể như 'std :: mt19937' là bắt buộc để cung cấp cho cùng một số cho một hạt giống cụ thể nhưng tôi không nghĩ rằng phân phối là. Vì vậy, bạn có thể phải viết phân phối của riêng bạn. –

Trả lời

37

Có, nhưng bạn cần khác hoặc đặt chính xác, cùng một PRNG trên mỗi nền tảng. std::default_random_engine engine là một PRNG được xác định thực hiện. Điều đó có nghĩa là bạn có thể không nhận được cùng một PRNG trên mọi nền tảng. Nếu bạn không có cùng một thì cơ hội của bạn nhận được cùng một trình tự là khá thấp.

Những gì bạn cần là một cái gì đó như std::mt19937 được yêu cầu để cung cấp cho cùng một đầu ra cho cùng một hạt giống. Trong thực tế tất cả các máy phát điện được xác định trong <random> bên cạnh std::default_random_engine engine sẽ tạo ra cùng một đầu ra khi sử dụng cùng một hạt giống.

Điều khác bạn cần biết là std::uniform_int_distribution cũng được thực hiện được xác định. Công thức mà nó phải sử dụng được định nghĩa nhưng cách thức mà nó đạt được được để lại cho người triển khai. Điều đó có nghĩa là bạn có thể không có được kết quả chính xác như nhau. Nếu bạn cần tính di động, bạn sẽ cần phải cuộn bạn phân phối riêng hoặc nhận được một bên thứ ba mà sẽ luôn luôn giống nhau bất kể nền tảng.

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