Có một số chức năng, tương tự như srand()
, mà tôi cần phải gọi để đảm bảo rằng std::random_shuffle()
luôn tạo ra các kết quả khác nhau? tức là nếu tôi gọi nó nhiều lần với cùng một dữ liệu, tôi muốn thứ tự khác nhau mỗi lần. Làm thế nào tôi có thể chắc chắn về điều đó?Làm thế nào để đảm bảo rằng std :: random_shuffle luôn tạo ra một kết quả khác?
Trả lời
std::random_shuffle
có hai hình thức. Một trong đó có 2 đối số (bắt đầu/kết thúc vòng lặp), và một trong đó có 3 (bắt đầu/kết thúc vòng lặp và một máy phát điện ngẫu nhiên).
Biểu mẫu đầu tiên sử dụng std::rand()
, vì vậy bạn sẽ sử dụng std::srand()
để tạo hạt giống cho trình tạo số ngẫu nhiên. Bạn cũng có thể sử dụng phiên bản 3 đối số và tự cung cấp RNG.
Khi tôi hiểu nó, cách thức đầu tiên thực hiện nó là kinh doanh của nó. Một số nền tảng có thể không sử dụng 'std :: rand'. –
Bạn nói đúng. Tôi đã nhìn vào phiên bản libstdC++. Tác giả gốc nên tham khảo tài liệu cho STL của bạn. Hoặc nếu họ không muốn dựa vào đó, họ nên sử dụng dạng thứ 3 và sử dụng một cái gì đó như 'boost :: random' hoặc C++ 0x' std :: random'. –
std::random_shuffle
có quá tải mẫu để chỉ định RNG.
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator& rand);
Tôi nghĩ rằng bạn có thể cho một functor phát ngẫu nhiên để std :: random_shuffle, vì vậy bạn có thể có thể kiểm soát hoàn toàn thế hệ số ngẫu nhiên. Tìm kiếm here, hàm functor này thay thế cho đối số mẫu RandomNumberGenerator.
Thường gọi srand(time(NULL))
trước gọi std :: random_shuffle() sẽ cung cấp cho bạn những gì bạn cần, nó cung cấp cho bạn kết quả khác nhau mỗi khi bạn gọi std :: random_shuffle(). Đó là bởi vì std :: random_shuffle() gọi nội bộ rand() trong quá trình triển khai thực hiện nhiều nhóm (ví dụ: VS2008 và gcc).
Tất nhiên bạn có thể tự mình làm RNG nếu bạn muốn gọi std quá tải khác :: random_shuffle với tham số bổ sung.
Như một phương sách cuối cùng, bạn có thể:
- Gọi
std::random_shuffle
- Tính một hash của chuỗi, lưu trữ nó trong một
std::set
- Huỷ nếu băm đã có mặt
Tôi không thấy cách sử dụng trình tạo tùy chỉnh có thể bảo đảm đảm bảo rằng chuỗi là duy nhất.
random_shuffle bị phản đối vì C++ 14 (loại bỏ trong C++ 17) và thay thế bằng ngẫu nhiên (tồn tại từ C++ 11) http://en.cppreference.com/w/cpp/algorithm/random_shuffle
sử dụng càng tốt:
shuffle(items.begin(), items.end(), std::default_random_engine(std::random_device()()));
- 1. cách đảm bảo rằng JDialog luôn ở trên đầu trang
- 2. Đảm bảo rằng Ngoại lệ luôn bị vô hiệu
- 3. Làm thế nào để đảm bảo rằng tối ưu hóa trình biên dịch không đưa ra nguy cơ bảo mật?
- 4. Làm cách nào để đảm bảo rằng trang web mở ra bằng thanh cuộn ở giữa
- 5. Làm thế nào tôi có thể đảm bảo rằng nhiệm vụ processResources của một bản xây dựng gradle luôn chạy?
- 6. Làm thế nào để đảm bảo rằng một phím dict python là chữ thường?
- 7. Làm thế nào để đảm bảo rằng một jnlp được chạy trên 64bits jvm
- 8. Làm thế nào để đảm bảo hai vectơ khác nhau được xáo trộn theo thứ tự trong C++?
- 9. Có đảm bảo rằng kết quả của globbing sẽ được sắp xếp trong Perl?
- 10. Làm thế nào để bảo đảm Elmah.axd?
- 11. Là std :: cout đảm bảo được khởi tạo?
- 12. Làm thế nào để đảm bảo rằng jQuery của tôi. Đã chạy vào cuối
- 13. Làm thế nào để JVM đảm bảo rằng System.identityHashCode() sẽ không bao giờ thay đổi?
- 14. Đảm bảo rằng Spring Bean được khởi tạo đúng cách
- 15. Không truyền tới int sau khi std :: floor đảm bảo kết quả đúng?
- 16. Kết quả của truy vấn LINQ luôn được đảm bảo theo đúng thứ tự?
- 17. Làm thế nào để đảm bảo rằng một trường sẽ không bao giờ rỗng trong một lớp Java
- 18. Làm cách nào để đảm bảo rằng các giao dịch lồng nhau được cam kết độc lập với nhau?
- 19. foreach% dopar% - đảm bảo về thứ tự kết quả?
- 20. Log4J; làm thế nào để đảm bảo timestamps luôn luôn trong GMT bằng cách sử dụng ConversionPattern?
- 21. Làm thế nào để đảm bảo rằng động lượng được giữ sau một mốc phát triển lớn?
- 22. Làm cách nào để đảm bảo rằng wxFrame được đưa lên nền trước?
- 23. Làm cách nào để đảm bảo rằng strtol() đã trả về thành công?
- 24. Trộn danh sách, đảm bảo rằng không có mục nào ở cùng một vị trí
- 25. Đảm bảo rằng các đối tượng thực hiện Comparable
- 26. Có cách nào tốt để đảm bảo kết quả hàm C++ không bị bỏ qua?
- 27. Trong Perl, làm thế nào tôi có thể đảm bảo rằng một chuỗi tương ứng với một ngày hợp lệ?
- 28. Đảm bảo không đảm bảo VirtualMachineError
- 29. Làm cách nào để đảm bảo sự kiện AppDomain.CurrentDomain.AssemblyResolve luôn được kích hoạt?
- 30. Làm cách nào để chọn X hàng ngẫu nhiên trong khi đảm bảo rằng các hàng nhất định của Y có kết quả?
Đó doesn' t âm thanh rất ngẫu nhiên với tôi ... – Blindy
@Blindy: Đó là ngẫu nhiên, nhưng kết quả không được phân phối đồng đều. –
srand khá tốt. Nếu nó không đủ tốt cho nhu cầu của bạn, hãy tìm kiếm các máy phát ngẫu nhiên khác (có thể tăng) –