随机生成器Java的最佳实践

时间:2016-11-09 12:42:14

标签: java arraylist random

有一个数字数组我想用随机生成器随机选择它的每个索引。随机生成器在已经选择的索引上避免无用循环的最佳做法是什么?到目前为止,我使用一个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
   }
}

3 个答案:

答案 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():)

,我会这样做的