【问题标题】:Filtering Enum of chances and selecting one based on a random chance过滤机会枚举并根据随机机会选择一个
【发布时间】:2018-08-14 04:50:35
【问题描述】:

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

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

目前,大多数情况下,它会准确地选择其中一个等级值,而不会出现问题。然而,大约 %15 的时间我会收到一个IndexArrayOutOfBounds

我知道这是因为枚举中的机会分散得很远(因为如果我向枚举添加更多值,机会就不会像现在那样分散,那么这个异常就不会发生)。

如何解决此错误?或者有更好的方法吗?

请随意使用 Java 回答

【问题讨论】:

    标签: java arrays random enums kotlin


    【解决方案1】:

    似乎当您的randomChance(100F) 返回一个大于60F 的浮点数时,没有RewardType 被选中(或者我误解了一些东西 - 我真的不了解 Kotlin;请验证这一点)。

    此外,您似乎在val (tier, tierChance)Pair(it.chance, it.tier) 中选择it.chance 作为tier,并选择it.tier 作为tierChance

    【讨论】:

      【解决方案2】:

      这似乎是问题所在:

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

      如果过滤器为空,可能当randomChance(100F)返回一个大于60F的浮点数时,正如Tomasz Linkowski所指出的,调用.map将导致IndexArrayOutOfBounds

      请验证。

      【讨论】:

        【解决方案3】:

        我感谢你们所有的人通过评论做出的贡献。但是我自己想出了一个解决方案,我已经测试过并且根据枚举中的值非常准确。

            fun tier() : Int {
            for (tier in rewardType.values().reversed()) {
                if(tier.chance.passRandom())
                    return tier.tier
            }
            return 0
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-06
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          • 2021-10-18
          • 1970-01-01
          • 2016-05-18
          相关资源
          最近更新 更多