我已经尝试了论坛中的一些解决方案,但对我没有用,如果答案是用科特林语言特定的,那么它将对我有更大的帮助。
答案 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,您可以
一个简单的实现是:
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