私は次のような列挙型からランダムな値を選択することにしました:
import std.random : uniform;
import std.stdio : writefln;
import std.conv;
enum E {A, B, C}
int main(){
auto select = cast(E)uniform(to!int(E.min), to!int(E.max));
writefln("select %s", select);
return 0;
}
これは驚くほど冗長であり、列挙型メンバーがデフォルト以外の値(またはより大きい値int
)をとると問題が発生しやすくなります。
理想的には、列挙型の要素を表す範囲を取得し、これをに提供しrandomSample
ます。ただし、これは可能ではないようです。
Dの列挙型からランダムな値を選択するためのより慣用的な方法はありますか?
編集:
fwendによって提供された答えを使用して、これが私が望むものを達成するテンプレート関数です:
T RandomEnumElement(T)() if (is(T == enum)){
auto members = [EnumMembers!T];
return members[(uniform(0, members.length))];
}