生成随机枚举

nul*_*dix 12 c++ enums

如何在C++中随机选择枚举类型的值?我想做这样的事情.

enum my_type(A,B,C,D,E,F,G,h,J,V);
my_type test(rand() % 10);
Run Code Online (Sandbox Code Playgroud)

但这是非法的......没有从int到枚举类型的隐式转换.

zil*_*n01 24

怎么样:

enum my_type {
    a, b, c, d,
    last
};

void f() {
    my_type test = static_cast<my_type>(rand() % last);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果枚举值不连续,则无效. (3认同)

Mik*_*our 8

没有隐式转换,但显式转换将起作用:

my_type test = my_type(rand() % 10);
Run Code Online (Sandbox Code Playgroud)


Bar*_*ers 7

这是我最近解决类似问题的方法。我把它放在一个合适的 .cc 文件中:

static std::random_device rd;
static std::mt19937 gen(rd());
Run Code Online (Sandbox Code Playgroud)

在定义枚举的标头内:

enum Direction
{
    N,
    E,
    S,
    W
};
static std::vector<Direction> ALL_DIRECTIONS({Direction::N, Direction::E, Direction::S, Direction::W});
Run Code Online (Sandbox Code Playgroud)

并生成一个随机方向:

Direction randDir() {
    std::uniform_int_distribution<size_t> dis(0, ALL_DIRECTIONS.size() - 1);
    Direction randomDirection = ALL_DIRECTIONS[dis(gen)];
    return randomDirection;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记

#include <random>
Run Code Online (Sandbox Code Playgroud)