Có cách nào để chọn ngẫu nhiên một phần tử từ một kiểu liệt kê theo cách an toàn không? Cách tốt nhất để làm điều đó, mà tôi có thể tìm thấy, là giới thiệu một giá trị terminator như phần tử cuối cùng của enum, vì vậy bạn biết có bao nhiêu giá trị, sau đó tạo một số nguyên ngẫu nhiên trong phạm vi thích hợp mà bạn cast vào enum. Nhưng một giá trị terminator không đại diện cho bất cứ điều gì, vì vậy sau đó bạn có một giá trị enum không hợp lệ, và điều này không phải là loại an toàn. Có cách nào tốt hơn để làm điều đó trong các tiêu chuẩn C++ mới nhất?Chọn ngẫu nhiên một phần tử từ một kiểu liệt kê theo cách an toàn kiểu mới nhất với C++
Trả lời
Điều này có vẻ giống như một trường hợp sử dụng tốt cho một câu hỏi std::map
std::map<std::string, const int> nicer_enum {{"Do", 3}, {"Re", 6}, {"Mi", 9}};
std::cout << nicer_enum["Re"] << '\n'; // 6
auto elem = nicer_enum.cbegin();
std::srand(std::time(nullptr));
std::advance(elem, std::rand() % nicer_enum.size());
std::cout << elem->second << '\n'; // 3, 6 or 9
for (const auto &kv : nicer_enum)
std::cout << kv.first << ": " << kv.second << ' '; // Do: 3 Mi: 9 Re: 6
std::cout << '\n';
Tuyệt vời! Nhưng sẽ tốt hơn nếu bạn sử dụng '
Đồng ý, nhưng tôi không muốn phân tâm từ phần liên quan của câu trả lời của tôi. (Và bạn có lẽ không nên thay đổi kích thước các phím bản đồ dù sao đi nữa). –
@RayHamel: Việc sử dụng 'const char *' * làm * phân tâm khỏi phần liên quan của câu trả lời của bạn. –
- 1. Chọn một phần tử ngẫu nhiên từ một tập hợp
- 2. Swift: Chọn một giá trị liệt kê ngẫu nhiên
- 3. kiểu liệt kê trong C#
- 4. Liệu Perl có một kiểu liệt kê?
- 5. C# Chọn phần tử ngẫu nhiên từ Danh sách
- 6. Chọn phần tử ngẫu nhiên từ mảng, nhưng duy nhất
- 7. Tuy nhiên, một kiểu mới so với dữ liệu (vấn đề kiểu cách)
- 8. Viết một lớp học theo kiểu an toàn
- 9. Scala: cách liệt kê không an toàn?
- 10. đặt một chuỗi kiểu toàn bộ thành một phần tử từ javascript (không phải các tham số kiểu riêng)
- 11. Chọn các phần tử m một cách ngẫu nhiên từ một vector chứa các phần tử n
- 12. Lấy phần tử ngẫu nhiên từ C# HashSet nhanh chóng
- 13. Mã hóa không phải là một kiểu liệt kê?
- 14. Chuyển đổi một Seq [Chuỗi] thành một kiểu chữ theo cách an toàn
- 15. Cách pythonic nhất để bật một phần tử ngẫu nhiên từ danh sách là gì?
- 16. Chọn đúng một phần tử ngẫu nhiên từ bảng băm có chuỗi?
- 17. Lấy x phần tử ngẫu nhiên từ một mảng
- 18. Chọn một phần tử ngẫu nhiên từ một mảng kết hợp PHP
- 19. Chọn ngẫu nhiên một phần tử từ danh sách có trọng số
- 20. Lấy phần tử ngẫu nhiên từ hashset?
- 21. Sử dụng một kiểu liệt kê làm tham số mẫu
- 22. Tìm phần tử theo bộ chọn kiểu trong jquery
- 23. Chọn phần tử ngẫu nhiên trong danh sách R?
- 24. Phần tử ngẫu nhiên trong bản đồ
- 25. Phân ngẫu nhiên các phần tử trong một mảng?
- 26. Tạo các số ngẫu nhiên một cách an toàn trong mục tiêu-C
- 27. Chọn phần tử ngẫu nhiên từ một mảng và loại bỏ nó
- 28. Làm cách nào để quá tải một toán tử cho một liệt kê trong C#?
- 29. Chuyển đổi ngầm định từ kiểu liệt kê 'UIBarButtonSystemItem' thành kiểu liệt kê khác 'UIBarButtonItemStyle' - iPad - iOS5
- 30. Liệt kê với kiểu trả về không phải là chuỗi?
Thú vị, nhưng tất cả nắm xuống "là có một, kiểu an cách phổ biến để xác định có bao nhiêu giá trị trong một enum?" và câu trả lời cho điều đó thật đáng buồn là không. Thành ngữ tiêu chuẩn là, như bạn đề cập, để bao gồm một giá trị sentinel trong enum, nhưng tôi đồng ý rằng là xấu xí. Giải pháp khác duy nhất của bạn thực sự sẽ là viết một lớp tùy chỉnh để đại diện cho enum của bạn, cung cấp một số loại chuyển đổi tiềm ẩn, nhưng điều đó gần như chắc chắn được thiết kế quá mức. Bên cạnh đó, nó trở nên tồi tệ hơn lần đầu tiên có vẻ như: các giá trị trong một enum không phải tăng tuyến tính; có thể nhảy và gián đoạn. –