我有一个x大小的数组,我需要随机浏览一下这个列表,但需要一次查看每个元素。最有效的方法是什么?
答案 0 :(得分:8)
你要找的是洗牌
试试这个 -
// Create a list
List list = new ArrayList();
// Add elements to list
// Shuffle the elements in the list
Collections.shuffle(list);
// Create an array
String[] array = new String[]{"a", "b", "c"};
// Shuffle the elements in the array
Collections.shuffle(Arrays.asList(array));
答案 1 :(得分:3)
只需shuffle数组,然后迭代它。
Collections.shuffle(Arrays.asList(yourArrayReference));
答案 2 :(得分:2)
这是一种节省时间和空间的方法。
import java.util.Enumeration;
import java.util.Random;
public class RandomPermuteIterator implements Enumeration<Long> {
int c = 1013904223, a = 1664525;
long seed, N, m, next;
boolean hasNext = true;
public RandomPermuteIterator(long N) throws Exception {
if (N <= 0 || N > Math.pow(2, 62)) throw new Exception("Unsupported size: " + N);
this.N = N;
m = (long) Math.pow(2, Math.ceil(Math.log(N) / Math.log(2)));
next = seed = new Random().nextInt((int) Math.min(N, Integer.MAX_VALUE));
}
public static void main(String[] args) throws Exception {
RandomPermuteIterator r = new RandomPermuteIterator(100);
while (r.hasMoreElements()) System.out.print(r.nextElement() + " ");
}
@Override
public boolean hasMoreElements() {
return hasNext;
}
@Override
public Long nextElement() {
next = (a * next + c) % m;
while (next >= N) next = (a * next + c) % m;
if (next == seed) hasNext = false;
return next;
}
}
答案 3 :(得分:0)
你可以使用一个随机数生成器,它通常在大多数面向对象语言中默认使用,并使用第二个数组来跟踪你已经检查过的内容。
本质: