gpt4 book ai didi

d - 在 D 中选择一个枚举的随机元素

转载 作者:行者123 更新时间:2023-12-04 07:25:43 24 4
gpt4 key购买 nike

我已经开始从枚举中选择随机值,如下所示:

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))];
}

最佳答案

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;
}

编辑 : 如果需要多次使用枚举值,可以先将它们存储在一个静态不可变数组中,否则每次都会构建该数组。这也可以让您摆脱神奇的数字 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;
}

编辑 2 :正如 Idan Arye 所指出的,模板可以更简洁:
T RandomEnumElement(T)() if (is(T == enum)){
return [EnumMembers!T][(uniform(0, $))];
}

编辑 3 : tgehr 提出了以下解决方案,它将在编译时构建一次查找表并完全避免 GC 分配:
T RandomEnumElement(T)() if (is(T == enum)) {
static immutable members = [EnumMembers!T];
return members[uniform(0, $)];
}

关于d - 在 D 中选择一个枚举的随机元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com