android - 如何生成随机数,使每个数字只出现一次?

标签 android android-studio kotlin

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

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/

相关文章:

android-studio - 从探查器中捕获的单击事件中查找 View 和容器片段信息

java - 如何使用关心下一个元素的谓词来限制 Kotlin 序列?

validation - Kotlin 数据类和 Bean 验证 : @NotNull on Long fields does not work

android - 使用 navhost 时无法更改工具栏后退图标

android - 指纹无法在服务中工作

android - 屏幕截图 :get Bitmap from Textureview and display in imageview android

android - 在 Android Studio 的编辑器左侧显示 git 更改

android - 如何在 Android Studio 中禁用设备监控?

kotlin - AssertJ: `ignoringFields` 是不是忽略了所有提供的字段?

android - 如何使用 DiffUtil 获取插入项的位置?