在Java中生成随机唯一序列

时间:2011-09-13 15:42:42

标签: java random

我有一系列数字,比如说它是

[1, 3, 5, 7, 9]

可以生成5个!这是这些数字的120个独特序列。例如

1 3 5 7 9
5 1 3 9 7
7 3 9 5 1
1 7 9 5 3
... and so forth

我需要随机生成10个这样的序列,没有重复。任何建议都会非常感激。

3 个答案:

答案 0 :(得分:4)

List<Integer> template = Arrays.asList(1, 3, 5, 7, 9);
Set<List<Integer>> seen = new HashSet<List<Integer>>();
for (int i = 0; i < 10; ++i) {
    List<Integer> items = new ArrayList<Integer>(template);
    do {
        Collections.shuffle(items);
    } while (!seen.add(items));
    System.out.println(items);
}

: - )

答案 1 :(得分:3)

你想要的是生成给定数组的n个随机排列。 存在一种用于生成一个随机置换的简单算法,这在wikipedia上得到了很好的解释。但是你仍然需要检查它的唯一性。

在Java中:

Random rand = new Random();

int[] generateRandomPermutation(int n) {
    int[] res = new int[n];
    for (int i = 0; i < n; i++) {
        int d = rand.nextInt(i+1);
        res[i] = res[d];
        res[d] = i;
    }
    return res;
}

另一种解决方案是使用置换编号方案(呈现here),并生成n个随机不同整数的对应置换(从0到s!-1,其中s是数组的大小)。

答案 2 :(得分:0)

您可以查看this StackOverflow thread,特别是关于在java.util.Collections中使用shuffle功能的帖子。