tôi đã thực hiện để chọn các giá trị ngẫu nhiên từ sự đếm như vậy:Chọn một yếu tố ngẫu nhiên của một enum trong D
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;
}
này bất ngờ tiết, và dễ bị các vấn đề nếu có thành viên enum có giá trị bên ngoài mặc định (hoặc lớn hơn int
).
Lý tưởng nhất là tôi sẽ lấy một phạm vi đại diện cho các yếu tố của enum và cung cấp điều này cho randomSample
. Tuy nhiên, điều này dường như không thể.
Có cách nào thành ngữ hơn để chọn một giá trị ngẫu nhiên từ một enum trong D không?
EDIT:
Sử dụng câu trả lời cung cấp bởi fwend, đây là một hàm mẫu đạt được những gì tôi muốn:
T RandomEnumElement(T)() if (is(T == enum)){
auto members = [EnumMembers!T];
return members[(uniform(0, members.length))];
}
Hiện tại bản chỉnh sửa không biên dịch, 'Đánh giá' cần loại' E [] '. – cmh
@cmh Lạ, nó biên soạn tốt với tôi. dmd 2.060 win7 – fwend
Xin lỗi nó hoạt động, nó cần đối số khi bên trong một hàm mẫu. – cmh