我正在尝试从以下枚举中筛选,以根据随机机会选择其中一个值。
enum class rewardType(var chance : Float, var tier : Int) {
TIER_1(60.0F,0),
TIER_2(45.0F,1),
TIER_3(20.0F,2),
TIER_4(10.0F,3),
TIER_5(2.0F,4),
TIER_6(1.0F,5)
}
目前,我正在使用此代码选择一个值。
val (tier, tierChance) = rewardType.values().filter { it.chance.passRandom() }
.map { Pair(it.chance, it.tier) }
还有我的随机效用函数
val random = ThreadLocalRandom.current()!!
fun randomChance(value: Float) = random.nextFloat() * value
fun Float.passRandom() = randomChance(100F) < this
目前,大多数情况下,它将准确地选择一个没有问题的层值。然而,大约在的时候,我会得到一个索引arrayoutofbounds。
我知道这是因为枚举中的机会分散到很远的地方(因为如果我向枚举添加更多值,机会不会像它们那样分散,那么就不会发生此异常)。
如何修复此错误?或者有更好的方法吗?
使用Java轻松回答
我很感谢你们所有人的评论。然而,我自己提出了一个解决方案,经过测试,根据枚举中的值,该解决方案非常准确。
fun tier() : Int {
for (tier in rewardType.values().reversed()) {
if(tier.chance.passRandom())
return tier.tier
}
return 0
}
这似乎是问题所在:
filter{ it.chance.passRandom() }
.map { Pair(it.chance, it.tier) }
如果筛选器为空,则可能在Tomasz Linkowski调用时返回大于60F的浮点值。映射将导致索引边界排列
请核实。
似乎当您的randomChance(100F)返回大于60F的浮点时,没有选择任何RewardType(或者我误解了什么-我真的不知道Kotlin,请验证)。
此外,您似乎正在选择它。机会作为层和it。层(tier,tierChance)
问题内容: 如果我有这样的枚举: 随机挑选一个的最佳方法是什么?它不需要是生产质量的防弹产品,但是相当均匀的分配将是不错的选择。 我可以做这样的事情 但是有更好的方法吗?我觉得这是之前已解决的问题。 问题答案: 我唯一建议的是缓存结果,因为每个调用都会复制一个数组。另外,不要每次都创建一个。保持一个。除此之外,您在做什么都很好。所以:
如果我有这样的枚举: 随机挑选的最佳方式是什么?它不需要是生产质量的防弹产品,但一个相当均匀的分布将是很好的。 我可以做这样的事 但是有没有更好的方法呢?我觉得这是以前解决过的问题。
我需要java JAVA CODE中此解决方案的delphi解决方案
问题内容: 如何根据分配给每一行的概率机会从数据库中选择随机行。 例子: 如何根据必须选择的可能性来选择随机的品牌名称及其值。 和可以结合使用吗?如果是这样,最好的方法是什么? 问题答案: 您可以通过使用然后再使用累积和来执行此操作。假设它们的总和为100%: 笔记: 在子查询中被调用一次以初始化变量。多次调用是不可取的。 随机数极有可能恰好位于两个值之间的边界上。的任意选择1。 通过在时停止子查
微调器板条箱有一个枚举,其中包含大量可能的微调器。 这是枚举(跳过除顶部和底部4之外的所有值): 新微调器易于创建: 但是,我希望随机选择一个微调器,这是行不通的: 因为: 如何随机选择枚举值,并使用该值显示随机微调器?
我正在编写一个二十一点游戏。我有一个所有可用牌类型的枚举。交易时,我想使用Random从枚举中随机选择一张牌给玩家。如何使用整数值对应枚举值?或者,我如何为该枚举的变量随机选择枚举值? 纸牌Enun: