过滤机会枚举并根据随机机会选择一个

时间:2018-08-14 04:50:35

标签: java arrays random enums kotlin

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

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随时回答

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

这似乎是问题所在:

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

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

请验证。

答案 2 :(得分:0)

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

//Initialize bugsnag
Bugsnag.init(this);