当前位置: 首页 > 知识库问答 >
问题:

以常规方式选择有效的随机枚举值

苏雅珺
2023-03-14

假设我们有一个枚举类型。

enum class E : underlying_type_of_E {
 v1 = uE1,
 v2 = uE2,
   //...
 vN = uEN
};

typedef typename std::underlying_type<E>::type uE;

一般来说,并非uE的所有值都是E的有效值,因为我们可以选择它们之间的关系。是否有一种通用的方法来创建E的随机、有效(在定义中命名,不可分配)值?例如,这将不起作用:

std::mt19937 m;
std::uniform_int_distribution<uE> randomUE(0, std::numeric_limits<uE>::max());

E e = static_cast<E>( randomUE(m) );

因为:

  1. 值范围不能从0开始
  2. 值范围不能以std::numeric\U limits::max()结束
  3. 值范围可能根本不是范围-我们可以从uE中为E选择离散值,例如{1,3,64,272}

鉴于所有枚举值在编译时都是已知的,我无法想象为什么这会有任何危险或容易出错的原因。

至于为什么我想要这样的东西——我正在研究一种使用模板基因存储的遗传算法。现在,我使用枚举作为染色体,并将它们存储在std::向量中


共有1个答案

左丘弘致
2023-03-14

如果您准备使用预处理器宏来创建枚举类型和有关它的一些元数据,您可以这样做,但这是一个小麻烦:

>

  • 调用可变参数宏:

    ENUM(E,
         v1 = uE1,
         v2 = uE2,
         // ...
         vN = uEN);
    

    创建一个模板化类,其中连续变量默认由递增的静态成员初始化,但可以从任何基础类型(例如int)分配给。

    static Incrementing<E, Underlying> __VA_ARGS__; \
    

    使用上面的值初始化具有递增值的数组(需要一个操作符底层()常量成员)。

    static const Underlying values[] = { __VA_ARGS__ }; \
    

    然后,数组包含命名的枚举值。。。。

    我几年前在这里写的这个概念有一个完全过度的版本,但是考虑到你的简单要求,我建议从头开始。

  •  类似资料:
    • 我需要java JAVA CODE中此解决方案的delphi解决方案

    • 问题内容: 如果我有这样的枚举: 随机挑选一个的最佳方法是什么?它不需要是生产质量的防弹产品,但是相当均匀的分配将是不错的选择。 我可以做这样的事情 但是有更好的方法吗?我觉得这是之前已解决的问题。 问题答案: 我唯一建议的是缓存结果,因为每个调用都会复制一个数组。另外,不要每次都创建一个。保持一个。除此之外,您在做什么都很好。所以:

    • 微调器板条箱有一个枚举,其中包含大量可能的微调器。 这是枚举(跳过除顶部和底部4之外的所有值): 新微调器易于创建: 但是,我希望随机选择一个微调器,这是行不通的: 因为: 如何随机选择枚举值,并使用该值显示随机微调器?

    • 我正在编写一个二十一点游戏。我有一个所有可用牌类型的枚举。交易时,我想使用Random从枚举中随机选择一张牌给玩家。如何使用整数值对应枚举值?或者,我如何为该枚举的变量随机选择枚举值? 纸牌Enun:

    • 如果我有这样的枚举: 随机挑选的最佳方式是什么?它不需要是生产质量的防弹产品,但一个相当均匀的分布将是很好的。 我可以做这样的事 但是有没有更好的方法呢?我觉得这是以前解决过的问题。

    • 我正在尝试从以下枚举中筛选,以根据随机机会选择其中一个值。 目前,我正在使用此代码选择一个值。 还有我的随机效用函数 目前,大多数情况下,它将准确地选择一个没有问题的层值。然而,大约在的时候,我会得到一个索引arrayoutofbounds。 我知道这是因为枚举中的机会分散到很远的地方(因为如果我向枚举添加更多值,机会不会像它们那样分散,那么就不会发生此异常)。 如何修复此错误?或者有更好的方法