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 } doesn't do anything. It's a lambda that will simply return Unit.

    假设您发现重复的号码时再次调用了Click侦听器,由于您没有早日从函数返回,因此您仍将号码再次添加到列表中。因此,您最终将在列表中出现重复项。确实应该是Set,因为它不需要任何重复的值。

    这是while循环的主要情况。为避免代码永久占用的可能性,应检查错误情况并抛出异常或向用户显示错误。

    val pickedNumbers = mutableSetOf<Int>()
    
    nextnumberbutton.setOnClickListener {
        if (pickedNumbers.size == 75) {
            Toast.makeText(context, "All numbers already picked", LENGTH_LONG).show()
            return
        }
        var rand: Int? = null
        while (rand !in pickedNumbers) {
            rand = Random.nextInt(75)
        }
        numbertextview.text = rand.toString()
        pickedNumbers.add(rand)
    }
    

    编辑:当接近数值极限时,上面的代码可能会花费越来越长的时间来选择数字,因为它只是猜测数字,如果已经选择了数字,则必须重试。更好的策略是从所有数字的集合开始,并在进行时从该数字集合中删除:

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