import std.random : uniform; import std.stdio : writefln; import std.conv; import std.traits; enum E {A, B, C} int main(){ auto select = [EnumMembers!E][uniform(0, 3)]; writefln("select %s", select); return 0; }
Edit : if you need to use enumeration values more than once, you can first save them in a static immutable array, otherwise the array will be built every time. It also allows you to get rid of the magic number 3.
(...) int main(){ static immutable Evalues = [EnumMembers!E]; auto select1 = Evalues[uniform(0, Evalues.length)]; writefln("select %s", select1); auto select2 = Evalues[uniform(0, Evalues.length)]; writefln("select %s", select2); return 0; }
Edit 2 . As Idan Ari noted, the pattern can be even:
T RandomEnumElement(T)() if (is(T == enum)){ return [EnumMembers!T][(uniform(0, $))]; }
Edit 3 : tgehr proposed the following solution, which would collect the lookup table once at compile time and not allocate GC at all:
T RandomEnumElement(T)() if (is(T == enum)) { static immutable members = [EnumMembers!T]; return members[uniform(0, $)]; }
fwend
source share