我在这里创建代码,但我相信有一种方法可以提高效率。我尝试了很多方法,但似乎没有用。
protected void randomise() {
int[] copy = new int[array().length]; //This makes the new int called randomIndex
// used to indicate if elements have been used
boolean[] used = new boolean[array().length]; //calling "used" as a new boolean for the array
Arrays.fill(used,false);
/**
* if index = 0, it means their is nothing in the index.
* if you apply a random number, it will copy that number to an array called index.
* if randomIndex in use, then the boolean becomes true.
*/
for (int index = 0; index < array().length;) {
do {
randomIndex = randomIndex();
} while (used[randomIndex]); //when random is in use, do the follow instruction.
copy[index] = array[index]; //copy the value value to an array called index.
used[randomIndex] = true; //when randomIndex is in use, then it becomes true.
}
//Of course, if there an extra random stores in the array, the index list is increased by one (index++).
for (int index =0;index < array().length; index++) {
array()[index] = copy[index]; //This tells where to copy the index value. in this case, it is a index array.
}
答案 0 :(得分:0)
您是否必须使用randomIndex
?
如果不是,您可以使用bool[]
消除do {} while()
,将值依次添加到copy
(这不是一个好名字)并选择范围内的randInt未选择的元素的len,然后使用bool[]
计算遍历array
元素(以便为copy
中的下一个元素做出选择。
答案 1 :(得分:0)
您似乎想要随机重新排序数组。如果是这样,那么确实有一个更有效的解决方案。您目前在输入的大小(O(n))上保留两个额外的数组,而您不需要。
随机改组是一个常见问题,显然已经提出了几种算法来完成这项任务。最有效的算法之一是Knuth's algorithm for random permutation
算法的想法是,在数组上循环一次,并且对于每个数字i,在i和0和i之间的(随机)数组索引之间执行随机交换。这样可以保证数组被洗牌(意味着每个项目都有相同的可能性放置在每个数组索引中),在O(n)时间内不使用任何额外的空间。
简而言之,
for (int i = 0; i < index; i++) {
int r = random.nextInt(i + 1);
exchange(array, i, r);
}
答案 2 :(得分:0)
很简单 - 使用一些索引集合并在使用它时删除元素。这种方式应该如下:
List<Integer> indexes = new ArrayList<>(array.length);
for (int i = 0 ; i < array.length ; i++) {
indexes.add(i);
}
Random r = new Random();
while (indexes.size() > 0) {
int randomIndex = r.nextInt(indexes.size());
int index = indexes.remove(randomIndex);
copy[index] = array[index];
}
请注意:
Collections.shuffle
方法。