首页 > 解决方案 > 如何生成随机数,使每个数字只出现一次?

问题描述

我想在单击按钮时生成随机数,每个随机数只出现一次。现在,我有一个数组,其中存储了所有生成的数字,这样我就可以检查这个数字是否以前生成过。但是,在这种情况下,我希望它生成另一个以前没有生成的数字。我一直在努力,但找不到合适的代码。

var arraylist = ArrayList<Int>()

nextnumberbutton.setOnClickListener {
    val rand = java.util.Random().nextInt(75)
    if (arraylist.contains(rand)) {
        kotlin.run { nextnumberbutton }
    } else {
        numbertextview.text = rand.toString()
    }
    arraylist.add(rand)
}

标签: androidandroid-studiokotlin

解决方案


run { nextnumberbutton }不做任何事情。这是一个简单地返回 Unit 的 lambda。

假设您确实在找到重复号码时再次调用了单击侦听器,您仍然会再次将该号码添加到列表中,因为您不会提前从函数中返回。因此,您最终会在列表中出现重复项。

您的策略可以通过 while 循环来完成,而不是在选择重复项时再次调用整个函数。例如,您可以使用while (rand !in arrayList) rand = Random.nextInt(75). 但是,当您接近值的限制时,这可能会花费越来越长的时间来选择数字,因为它只是猜测数字,如果已经选择了数字,则必须再次尝试。

一个更好的策略是从一组所有数字开始,然后从这个集合中删除。您还需要处理选择所有号码的情况,可能通过向用户显示消息。

val unpickedNumbers = (0..75).toMutableSet()

nextnumberbutton.setOnClickListener {
    if (unpickedNumbers.isEmpty()) {
        Toast.makeText(context, "All numbers already picked", Toast.LENGTH_LONG).show()
        return
    }
    val rand = unpickedNumbers.random()
    numbertextview.text = rand.toString()
    unpickedNumbers.remove(rand)
}

推荐阅读