Java 如何创建返回唯一随机数的函数?

Java 如何创建返回唯一随机数的函数?,java,android,kotlin,Java,Android,Kotlin,我在论坛上尝试过一些解决方案,但对我不起作用,如果答案是用kotlin语言给出的,那么它将对我更有帮助。你可以使用递归函数来尝试,该函数只返回0到6范围内的唯一随机数 private var randomNumber: Int = 0 private var integerList: MutableList<Int>? = null private fun getRandomNumber(): Int { val rand = Random() randomNumb

我在论坛上尝试过一些解决方案,但对我不起作用,如果答案是用kotlin语言给出的,那么它将对我更有帮助。

你可以使用递归函数来尝试,该函数只返回0到6范围内的唯一随机数

private var randomNumber: Int = 0
private var integerList: MutableList<Int>? = null

private fun getRandomNumber(): Int {
    val rand = Random()
    randomNumber = rand.nextInt(7)
    if (integerList!!.contains(randomNumber)) {
        getRandomNumber()
    } else {
        integerList!!.add(randomNumber)
    }
    return randomNumber
}
private-var-randomNumber:Int=0
私有变量整数列表:可变列表?=无效的
private fun getRandomNumber():Int{
val rand=Random()
randomNumber=rand.nextInt(7)
if(整数列表!!.contains(随机数)){
getRandomNumber()
}否则{
整数列表!!.add(随机数)
}
返回随机数
}
正如安德鲁·汤普森所说,你可以

  • 在列表中按顺序添加范围中的每个数字
  • 洗牌
  • 从列表中选择前n个数字
一个简单的实施方案是:

import java.util.ArrayList;
import java.util.Collections;

public class UniqueRandomNumbers {

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i=1; i<11; i++) {
            list.add(new Integer(i));
        }
        Collections.shuffle(list);
        for (int i=0; i<3; i++) {
            System.out.println(list.get(i));
        }
    }
}
import java.util.ArrayList;
导入java.util.Collections;
公共类UniquerandomNumber{
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();

对于(inti=1;i首先,我不建议为此使用函数,而是使用封装逻辑的类来提高可用性

第一选项

您可以使用
List
函数(是的,它在这里实际上是一个函数)生成一个包含所有可能数字的列表,然后将其洗牌,然后对其进行迭代

class UniqueRandomNumbers(lowerBound: Int, upperBound: Int) {
    private val iterator = List(upperBound - lowerBound) { 
        lowerBound + it + 1
    }.shuffled().iterator()
    val next get() = if (iterator.hasNext()) iterator.next() else null
}
第二选项

或者,您可以生成随机数,直到找到一个以前从未使用过的数字

class UniqueRandomNumbers(val lowerBound: Int, val upperBound: Int) {
    private val consumedNumbers = mutableSetOf<Int>()
    val next: Int?
        get() {
            var newNumber: Int

            if (consumedNumbers.size == (upperBound - lowerBound + 1)) {
                return null
            }

            do {
                newNumber = Random.nextInt(lowerBound, upperBound + 1)
            } while (newNumber in consumedNumbers)

            consumedNumbers += newNumber

            return newNumber
        }
}

是的,有,但我没有发现它们有帮助。如果用户需要100万的整数,这可能会变得很麻烦。在这个例子中,什么是整数列表?为什么不使用映射进行更有效的查找?请参阅编辑的代码,整数列表是一个可变列表,将包含生成的随机数。数字应该是一个列表。为了改进如果您的答案有质量,请添加一些注释,说明此代码的作用以及它如何解决原始问题。
class UniqueRandomNumbers(val lowerBound: Int, val upperBound: Int) {
    private val consumedNumbers = mutableSetOf<Int>()
    val next: Int?
        get() {
            var newNumber: Int

            if (consumedNumbers.size == (upperBound - lowerBound + 1)) {
                return null
            }

            do {
                newNumber = Random.nextInt(lowerBound, upperBound + 1)
            } while (newNumber in consumedNumbers)

            consumedNumbers += newNumber

            return newNumber
        }
}
val numberProvider = UniqueRandomNumbers(0, 2)

// returns 0, 1, 2 or null if all numbers have been consumed
numberProvider.next