Tôi tạo một vài nghìn đối tượng trong chương trình của mình dựa trên hàm C++ rand(). Giữ chúng trong bộ nhớ sẽ đầy đủ. Có cách nào để sao chép các hạt giống CURRENT của rand() tại bất kỳ thời điểm nào? Điều này sẽ cho tôi cơ hội để lưu trữ CHỈ hạt giống hiện tại và không phải đối tượng đầy đủ. (do đó tôi có thể tạo lại các đối tượng đó, bằng cách tái tạo cùng một chuỗi con số ngẫu nhiên giống hệt nhau)Cách lấy hạt giống hiện tại từ C++ rand()?
Giải pháp toàn bộ lưu toàn bộ số ngẫu nhiên được đưa ra bởi rand() - không đáng giá. Một khác sẽ là giải pháp là triển khai lớp của riêng tôi cho các số ngẫu nhiên.
Google không cho tôi manh mối tích cực. Có hàng trăm bài báo dạy những điều cơ bản của rand và srand, và tôi không thể tìm thấy những bài cụ thể.
Có ai biết các trình tạo số ngẫu nhiên khác với trình chặn hạt giống được triển khai không?
Cảm ơn bạn đã có câu trả lời nhanh! Có nhiều câu trả lời/giải pháp khả thi hơn cho câu hỏi này, vì vậy tôi đã đưa ra một danh sách các câu trả lời của bạn ở đây.
GIẢI PHÁP:
Câu trả lời ngắn gọn là: không có cách nào tiêu chuẩn để có được những hạt giống
Cách giải quyết gần nhất có thể là để tiết kiệm hạt giống ban đầu trong đầu, và đếm có bao nhiêu lần bạn gọi hàm rand(). Tôi đã đánh dấu giải pháp này là giải pháp vì nó hoạt động trên hàm std :: rand() hiện tại của mọi trình biên dịch (và đây là câu hỏi chính về). Tôi đã chấm điểm CPU 2.0 GHz của mình và thấy rằng tôi có thể gọi & đếm rand() 1.000.000.000 lần trong 35 giây. Điều này nghe có vẻ tốt, nhưng tôi có 80.000 cuộc gọi để tạo ra một đối tượng. Điều này hạn chế số lượng thế hệ đến 50.000 vì kích thước của unsigned dài. Dù sao, đây là mã của tôi:
class rand2 { unsigned long n; public: rand2() : n(0) {} unsigned long rnd() { n++; return rand(); } // get number of rand() calls inside this object unsigned long getno() { return n; } // fast forward to a saved position called rec void fast_forward (unsigned long rec) { while (n < rec) rnd(); } };
Một cách khác là thực hiện bộ tạo số giả ngẫu nhiên của riêng bạn, giống như một Matteo Italia đề nghị. Đây là giải pháp nhanh nhất và có thể là TỐT NHẤT. Bạn không bị giới hạn ở mức 4,294,967,295 rand() cuộc gọi và không cần phải sử dụng các thư viện khác. Điều đáng nói đến là các trình biên dịch khác nhau có các trình tạo khác nhau. Tôi đã so sánh LCG của Matteo với rand() trong Mingw/GCC 3.4.2 và G ++ 4.3.2. Cả 3 đều khác nhau (với seed = 0).
Sử dụng máy phát từ C++ 11 hoặc các thư viện khác như Cubbi, Jerry Coffin và Mike Seymour đề xuất. Đây là ý tưởng tốt nhất, nếu bạn đã làm việc với họ. Link cho C++ 11 máy phát điện: http://en.cppreference.com/w/cpp/numeric/random (có một số giới thiệu thuật toán ở đây quá)
Nếu trong giải pháp 2 chỉ giới hạn đếm là vấn đề bạn có thể thêm một bộ đếm 'chưa ký dài 'khác để đếm số lần tràn. Điều này sẽ có hiệu quả gấp đôi kích thước bit của truy cập của bạn và có thể, tất nhiên, tiếp tục mở rộng. – bjhend
BTW, thật tuyệt khi bạn thêm một bản tóm tắt giải pháp (truyền thống usenet cũ tốt?). – bjhend
Heh, no. Tôi thực sự đã phải google những gì usenet có nghĩa là :). Chỉ cần nghĩ rằng nó sẽ là tốt đẹp để cung cấp cho một số thông tin phản hồi, rằng các câu trả lời là hữu ích. – user1339629