19

How do I randomly select a value for an enum type in C++? I would like to do something like this.

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

But this is illegal... there is not an implicit conversion from int to an enum type.

null_radix
  • 692
  • 2
  • 6
  • 19

3 Answers3

30

How about:

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

void f() {
    my_type test = static_cast<my_type>(rand() % last);
}
zildjohn01
  • 11,339
  • 6
  • 52
  • 58
9

There is no implicit conversion, but an explicit one will work:

my_type test = my_type(rand() % 10);
Mike Seymour
  • 249,747
  • 28
  • 448
  • 644
8

Here is how I solved a similar problem recently. I put this in an appropiate .cc file:

static std::random_device rd;
static std::mt19937 gen(rd());

Inside the header that defines the enum:

enum Direction
{
    N,
    E,
    S,
    W
};
static std::vector<Direction> ALL_DIRECTIONS({Direction::N, Direction::E, Direction::S, Direction::W});

And to generate a random direction:

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

Don't forget to

#include <random>
Bart Louwers
  • 873
  • 9
  • 28