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

选择随机枚举值的简单而安全的方法是什么?

解浩渺
2023-03-14

我需要从枚举中选择一个随机值。在一些关于Nim的文章中,我找到了这个解决方案

import random

type Animal = enum
  Cat
  Dog
  Cow

echo rand(0..2).Animal

但这不能很好地扩展:如果在枚举中添加或删除一些值,我们必须调整上限。

我们甚至可以得到一个运行时错误:

import random

type Animal = enum
  Cat
  Dog

randomize(123)

while true:
  echo rand(0..2).Animal
Cat
Cat
Dog
…/example.nim(10) example
…/.choosenim/toolchains/nim-1.4.4/lib/system/fatal.nim(49) sysFatal
Error: unhandled exception: value out of range: 2 notin 0 .. 1 [RangeDefect]

我正在寻找一种简单的方法来从安全的枚举1中选择一个随机值,这意味着如果它编译,保证不会有RangeDefect或类似的运行时错误。

我还想知道,在上面的示例中,是否存在至少生成警告的编译器设置。

编译器似乎在原则上能够做到这一点:

Animal(5)

→ Error: 5 can't be converted to Animal

读入后https://nim-lang.org/docs/random.html关于

  • 兰特,兰特,范围[]
  • rand、rand、HSlice[T:序号或float或float32或float64,T:序号或float或float32或float64]
  • rand,HSlice[T:序号或float或float32或float64,T:序号或float或float32或float64]
  • rand,typedesc【T】

我认为以下其中一个可以工作,但它们不编译:

rand(Animal)

→ Error: type mismatch: got <type Animal>
rand(range(Animal))

→ Error: type mismatch: got <type Animal> but expected 'range = range (None)'
rand(range[Animal])

→ Error: expected range
rand(Slice[Animal])

→ Error: type mismatch: got <type Slice[example.Animal]>
rand(Slice(Animal))

→ Error: type mismatch: got <type Animal> but expected 'Slice = CompositeTypeClass'

这确实有效,但我想它不必要地效率低下,因为它需要分配和填充一个序列:

import sequtils

echo sample(Animal.toSeq)

我假设没有带孔的枚举,我知道这是另一个问题。

共有1个答案

韩寒
2023-03-14

一个简单的解决方案是使用低和高:

rand(Animal.low..Animal.high)

使用通用程序可以编写rand(动物):

import random

type Animal = enum
  Cat
  Dog
  Cow

proc rand(T: typedesc): T =
  rand(T.low..T.high)

randomize(123)

for _ in 1..6:
  echo rand(Animal)

输出:

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

  • 假设我们有一个枚举类型。 一般来说,并非的所有值都是的有效值,因为我们可以选择它们之间的关系。是否有一种通用的方法来创建E的随机、有效(在定义中命名,不可分配)值?例如,这将不起作用: 因为: 值范围不能从0开始 值范围不能以std::numeric\U limits::max()结束 值范围可能根本不是范围-我们可以从uE中为E选择离散值,例如{1,3,64,272} 鉴于所有枚举值在编译时都是

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

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

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

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