2010-07-25 64 views
6

Tôi muốn để có thể làm điều gì đó như thế này (rõ ràng là không hợp lệ C++):Tạo hai chuỗi độc lập ngẫu nhiên số (C++)

rng1 = srand(x) 
rng2 = srand(y) 

//rng1 and rng2 give me two separate sequences of random numbers 
//based on the srand seed 
rng1.rand() 
rng2.rand() 

Có cách nào để làm một cái gì đó như thế này trong C++? Ví dụ trong Java, tôi có thể tạo hai đối tượng java.util.Random với các hạt giống mà tôi muốn. Dường như chỉ có một trình tạo số ngẫu nhiên duy nhất trên toàn cầu trong C++. Tôi chắc chắn có những thư viện cung cấp chức năng này, nhưng dù sao để làm điều đó chỉ với C + +?

+4

Vì các số được trả về bởi 'rand' là ngẫu nhiên (giả), tại sao bạn cần nhiều hơn một trình tạo? Lấy số 2n từ một trình tạo số ngẫu nhiên sẽ cho kết quả tương tự để nhận số n từ mỗi máy phát số ngẫu nhiên. –

+3

@James: Hãy xem xét một mô phỏng xếp hàng với một nguồn ngẫu nhiên kiểm soát sự xuất hiện của các nhiệm vụ mới, và một nguồn ngẫu nhiên khác ảnh hưởng đến thời gian hoàn thành mỗi nhiệm vụ. Người ta có thể muốn lặp lại từng thử nghiệm nhiều lần, nhân rộng kịch bản "nhiệm vụ đến", nhưng với các thống kê "hoàn thành nhiệm vụ" khác nhau và điều đó đòi hỏi phải có nhiều RNG có thể được gieo độc lập. –

+0

@Jim: Tôi đồng ý rằng nó có thể được sử dụng cho điều đó. Tôi nghĩ tốt hơn là nên nạp dữ liệu "ngẫu nhiên" theo cách thủ công thay vì dựa vào PRNG. –

Trả lời

0

như @James McNellis đã nói, tôi không thể tưởng tượng tại sao bạn lại làm điều đó và những ưu điểm bạn sẽ nhận được. Mô tả tác dụng bạn muốn đạt được.

+3

Điều này sẽ tốt hơn nếu là bình luận chứ không phải là câu trả lời. – indiv

7

Trong TR1 (và C++ 0x), bạn có thể sử dụng tiêu đề tr1/random. Nó nên được xây dựng trong các trình biên dịch C++ hiện đại (ít nhất là cho g++MSVC).

#include <tr1/random> 
// use #include <random> on MSVC 
#include <iostream> 

int main() { 

    std::tr1::mt19937 m1 (1234); // <-- seed x 
    std::tr1::mt19937 m2 (5678); // <-- seed y 

    std::tr1::uniform_int<int> distr(0, 100); 

    for (int i = 0; i < 20; ++ i) { 
     std::cout << distr(m1) << "," << distr(m2) << std::endl; 
    } 

    return 0; 
} 
+0

+1 cho giải pháp chuẩn (sớm để được). –

1

Tôi chỉ muốn chỉ ra rằng việc sử dụng các hạt khác nhau có thể không cung cấp cho bạn thống kê chuỗi ngẫu nhiên độc lập. mt19937 là một ngoại lệ. Hai đối tượng mt19937 khởi tạo với các hạt khác nhau sẽ cung cấp cho bạn nhiều hơn hoặc ít hơn (tùy thuộc vào bạn yêu cầu) chuỗi độc lập về mặt thống kê với xác suất rất cao (có một cơ hội nhỏ là các chuỗi sẽ trùng lặp). RNG tiêu chuẩn của Java nổi tiếng là xấu. Có rất nhiều triển khai của mt19937 cho Java, mà nên được ưa thích hơn RNG cổ phiếu.

+0

Nghĩa là "thống kê" là gì? – bruziuz

0

Vì lý do gì, các máy phát sau đây can thiệp lẫn nhau. Tôi cần hai máy phát điện độc lập cho một nhiệm vụ và cần phải tái tạo lại các luồng. Tôi đã không đào vào mã nhưng máy phát điện std :: tr1 và C++ 11 dường như chia sẻ các trạng thái chung. Thêm m2 dưới đây thay đổi những gì m1 sẽ cung cấp.

std::tr1::mt19937 m1 (1234); // <-- seed x 
std::tr1::mt19937 m2 (5678); // <-- seed y 

Tôi phải tự xây dựng để đảm bảo tính độc lập.