对于你们来说,这可能是一个简单的任务,但是我真的很难使它起作用。我正在创建一种可以返回0-30的随机整数的方法。但是我要确保,相同的数字不会被使用两次。因此,我创建了一个名为UsedNumbersArray的数组来跟踪所有内容。
我的想法是,首先生成一个随机数,然后使用for循环逐个检查数组,以查看是否存在该数组。如果是这种情况,则必须将值替换为零,以确保不会再次找到它。
但是,很奇怪的是它替换了数组中与我们的随机数完全不同的数字。查看我的代码:
private static int checkIfNumberUsed(){
int questionNumber = randomNumberInRange(1,questionsWithAnswers[0].length); // create random number
boolean hasNotBeenUsed = false;
while (!hasNotBeenUsed){ // as long it HAS been used, it will continue to run the loop and create a random num till it gets what it wants
for (int i = 0; i < questionsWithAnswers[0].length ; i++) { // check if it has been used before
if (questionNumber==usedNumbersArray[i]){
usedNumbersArray[i]=0; // will replace the number with 0 so that it can't be found and used again
hasNotBeenUsed=true; // will exit the loop
}
}
questionNumber = randomNumberInRange(1,questionsWithAnswers[0].length); // if no matches are found it will generate a new random number
}
return questionNumber;
以下是输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
8 [1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、0、19、20、21、22、23、24、25 ,26,27,28,29,30]
如您所见。随机数是8,但它已经用0代替了原来的8替换了18?
希望您能解决这个问题。预先感谢
答案 0 :(得分:1)
您不必自己迭代数组。使用List.remove(int index)
。例如:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Pool {
private final Random r = new Random();
private final List<Integer> pool;
Pool(int size) {
pool = new ArrayList<>(size);
for (int i = 0; i < size; ++i) {
pool.add(i);
}
}
boolean isNotEmpty() {
return !pool.isEmpty();
}
int nextInt() {
int i = r.nextInt(pool.size());
return pool.remove(i);
}
public static void main(String[] args) {
Pool pool = new Pool(30);
while (pool.isNotEmpty()) {
System.out.println(pool.nextInt());
}
}
}
答案 1 :(得分:1)
我提出了一种不同的解决方案,在该解决方案中,您无需与语言打交道,而是可以充分利用其功能。这个想法是使用List
而不是数组,并在它们用完时删除值:
import java.util.ArrayList;
import java.util.Collections;
import static java.lang.Integer.valueOf;
import static java.util.stream.Collectors.toList;
import static java.util.stream.IntStream.range;
public class Randoms {
private final ArrayList<Integer> randomList;
public Randoms(int size) {
randomList = (ArrayList<Integer>)range(0, size).boxed().collect(toList());
Collections.shuffle(randomList);
}
public int nextValue() {
return randomList.remove(0);
}
public static void main(String[] args) {
int size = 30;
Randoms r = new Randoms(size);
for (int i = 0; i < size; i++) {
System.out.println(r.nextValue());
}
}
}
如果/当随机值用尽时,您将需要决定怎么做