Java:如何随机遍历数组?

时间:2011-09-14 02:34:50

标签: java random

我有一个x大小的数组,我需要随机浏览一下这个列表,但需要一次查看每个元素。最有效的方法是什么?

4 个答案:

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

你可以使用一个随机数生成器,它通常在大多数面向对象语言中默认使用,并使用第二个数组来跟踪你已经检查过的内容。

本质:

  1. 生成随机数
  2. 搜索主数组中的随机数
  3. 如果随机数不在已检查过的数组中......
  4. ...然后检查主阵列[random]
  5. 中的元素
  6. 将随机数添加到已检查数组的末尾