Я использую библиотеку случайных чисел C++ во многих местах. Это может быть не совсем удобно (например, нет базового класса для произвольного дистрибутива), но я научился с этим жить.
Теперь мне нужно равномерно выбирать значения из перечисляемого типа. Я знаю, на SO уже есть вопрос:
генерация случайных перечислений
однако тот:
Предполагается, что все значения перечисления являются смежными, т.е. это не будет работать для
enum Color { Red = 1, Green = 2, Blue = 4 }
где мы хотим, чтобы каждое из этих трех значений было выбрано с вероятностью 1/3.
- Не обеспечивает функциональность
std::uniform_distribution<>
, т.е. не работает со случайным движком, который вы передаете, и так далее.
Очевидно, я не могу использовать std::uniform_int_distribution<Color>
хотя бы по причине 1 выше. Что мне делать вместо этого?
Примечания:
- Код должен быть универсальным, т. е. тип перечисления будет параметром шаблона.
- Поскольку, скорее всего, мне понадобится некоторая инструментация только для грубого перечисления, вы можете предположить, что она у меня есть; просто сформулируйте свое предположение явно.
- В частности, и если это поможет, предположим, что я использую лучшие перечисления, благодаря чему я полностью вооружен всеми колокола и свистки.
- Если есть какой-то идиоматический способ сделать это без использования каких-либо таких инструментов, это было бы отличным ответом, но я сомневаюсь в этом.
- Допускаются решения только для C++11/14.
- Несколько идентификаторов перечисления с одинаковым значением не удваивают частоту, они просто являются псевдонимами друг друга. Если у вас есть простое решение, предполагающее, что их не существует, это также будет актуально, хотя и неоптимально.