我想在单击按钮时生成随机数,并且每个随机数仅出现一次。现在,我有一个数组,其中存储所有生成的数字,这样我就可以检查该数字之前是否已生成。但是,在这种情况下,我希望它生成另一个先前未生成的数字。我一直在努力,但找不到合适的代码。
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)
}
最佳答案
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)
}
关于android - 如何生成随机数,使每个数字只出现一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61409955/