有一个数字数组我想用随机生成器随机选择它的每个索引。随机生成器在已经选择的索引上避免无用循环的最佳做法是什么?到目前为止,我使用一个ArrayList来存储已经选择的那个,但我觉得最终这个算法最终会有很多浪费的循环。这是代码:
Random r = new Random();
ArrayList<Integer> found = new ArrayList<Integer>();
while(notAllPassed){
int prediction = r.nextInt(sizeOfArray);
if(!found.contains(prediction){
found.Add(prediction);
//Do stuff
}
}
答案 0 :(得分:4)
这个想法是,不是每次都选择一个随机索引,而是准备一个所有索引的混洗列表,然后按顺序迭代它。
List<Integer> indices = IntStream.range(0, sizeOfArray).boxed().collect(toList());
Collections.shuffle(indices);
for (int randomIndex : indices) {
// do your thing
}
答案 1 :(得分:3)
不是检查您是否已经生成了某些内容,而是采用不同的方法。创建一个包含所有可能值的数组,然后随机地重新排列数组。
您可以使用内置方法CSRF
对于初始列表,顺序并不重要,但最简单的方法就是一个接一个地填充0..n-1或1..n值。以更复杂的方式做到这一点并没有任何帮助,因为随机播放无论如何都是完全随机的。
答案 2 :(得分:0)
Marko Topolnik 绝对是他的answer。这是最好的方法。
所以我的回答只是为了完成,跟随你对Random
Random r = new Random(); // as you had it
ArrayList<Integer> found = new ArrayList<>(); // as you had it
for(int i = 0; i < sizeOfArray; i++){ // if you want ALL possible indexes
int prediction = r.nextInt(sizeOfArray); // exactly as you did it
while(found.contains(prediction)){ // here we check if the "found" list already contains the random index
prediction = r.nextInt(sizeOfArray); // if so, regenerate the "prediction" until one is generated that is not in the list
}
found.add(prediction); // this statement will only be reached after the while loop found an index that is not in the list
}
System.out.println(found.toString()); // convenience: print the list to see for yourself
正如我所说,这只是遵循你最初使用随机的想法。如果没有Collection.shuffle()
:)