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

时间:2019-02-06 12:40:29

标签: java android kotlin

我已经尝试了论坛中的一些解决方案,但对我没有用,如果答案是用科特林语言特定的,那么它将对我有更大的帮助。

4 个答案:

答案 0 :(得分:5)

您可以尝试使用递归函数,该函数仅返回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
}

答案 1 :(得分:0)

正如安德鲁·汤普森(Andrew Thompson)说的here,您可以

  • 在列表中依次添加范围内的每个数字
  • 随机播放
  • 从列表中获取前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));
        }
    }
}

这将打印3个从1到10的唯一随机数

答案 2 :(得分:0)

int[] Numbers;
int num = 0;

getRandomNum();

public void getRandomNum()
{
   Random rand = new Random(10);
   if(Numbers.contains(rand))
   {
      Log.i("console","Try Again");
   }
   else
   {
      num = rand;
      Numbers.add(rand); 
   }
}

答案 3 :(得分:0)

首先,我不会为此推荐功能,而应该使用封装可提高可用性的逻辑的类。

第一个选项

您可以使用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
        }
}

两种情况下的用法:

val numberProvider = UniqueRandomNumbers(0, 2)

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