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

筛选机会枚举并基于随机机会选择一个

洪楷
2023-03-14

我正在尝试从以下枚举中筛选,以根据随机机会选择其中一个值。

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轻松回答

共有3个答案

邴英毅
2023-03-14

我很感谢你们所有人的评论。然而,我自己提出了一个解决方案,经过测试,根据枚举中的值,该解决方案非常准确。

    fun tier() : Int {
    for (tier in rewardType.values().reversed()) {
        if(tier.chance.passRandom())
            return tier.tier
    }
    return 0
}
穆彬郁
2023-03-14

这似乎是问题所在:

filter{ it.chance.passRandom()   }
.map  { Pair(it.chance, it.tier) }

如果筛选器为空,则可能在Tomasz Linkowski调用时返回大于60F的浮点值。映射将导致索引边界排列

请核实。

云建木
2023-03-14

似乎当您的randomChance(100F)返回大于60F的浮点时,没有选择任何RewardType(或者我误解了什么-我真的不知道Kotlin,请验证)。

此外,您似乎正在选择它。机会作为层和it。层(tier,tierChance)

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

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

  • 我需要java JAVA CODE中此解决方案的delphi解决方案

  • 问题内容: 如何根据分配给每一行的概率机会从数据库中选择随机行。 例子: 如何根据必须选择的可能性来选择随机的品牌名称及其值。 和可以结合使用吗?如果是这样,最好的方法是什么? 问题答案: 您可以通过使用然后再使用累积和来执行此操作。假设它们的总和为100%: 笔记: 在子查询中被调用一次以初始化变量。多次调用是不可取的。 随机数极有可能恰好位于两个值之间的边界上。的任意选择1。 通过在时停止子查

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

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