android - 如何生成随机数,使每个数字只出现一次?
问题描述
我想在单击按钮时生成随机数,每个随机数只出现一次。现在,我有一个数组,其中存储了所有生成的数字,这样我就可以检查这个数字是否以前生成过。但是,在这种情况下,我希望它生成另一个以前没有生成的数字。我一直在努力,但找不到合适的代码。
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)
}
推荐阅读
- c++ - 如何在不指定模板类型的情况下声明通用抽象类的对象
- opencart - 如何在管理面板中删除广告 opencart
- google-cloud-platform - 游戏服务器 - 高延迟
- swift - 如果 swift 表格视图中有更多(大约 10 到 20 个)部分,如何返回部分值?
- java - 如何将某些未知语言环境中的字符串日期转换为其他已知语言环境?
- python-3.x - 如何使用 cv2.waitKey() 等待两个不同的键
- cron - 每两周运行一次任务的 Cron 作业
- python-3.x - Postgres sql Inner join 和 Delete 查询都返回不同的结果
- bash - 在 Mac OS 的自动化操作中运行“pod install” - 权限被拒绝
- android - React-native release apk 拒绝安装