我需要从枚举中选择一个随机值。在一些关于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(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)
我假设没有带孔的枚举,我知道这是另一个问题。
一个简单的解决方案是使用低和高:
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:
如果我有这样的枚举: 随机挑选的最佳方式是什么?它不需要是生产质量的防弹产品,但一个相当均匀的分布将是很好的。 我可以做这样的事 但是有没有更好的方法呢?我觉得这是以前解决过的问题。