我正在尝试从以下枚举中筛选出,以基于随机机会选择其中一个值。
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随时回答
答案 0 :(得分:2)
当您的temp->next->prev=temp;
返回的浮点数大于randomChance(100F)
时,似乎没有60F
被选中(或者我误解了一些东西-我真的不认识Kotlin;请验证一下)。
此外,似乎您在RewardType
和it.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);