Java中随机唯一序列的生成

Java中随机唯一序列的生成,java,random,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个序列,没有重复。任何建议都将不胜感激。列表模板=Arrays.asList(1,3,5,7,9); List<Integer> template = Arrays.asList(1, 3, 5, 7, 9); Set<List&

我有一个数字数组,比如说

[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个序列,没有重复。任何建议都将不胜感激。

列表模板=Arrays.asList(1,3,5,7,9);
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);
}
Set seen=新的HashSet(); 对于(int i=0;i<10;++i){ 列表项=新的ArrayList(模板); 做{ 收藏。洗牌(物品); }而(!seen.add(items)); 系统输出打印项次(项); }

:-)

您想要的是生成给定数组的n个随机排列。 有一个生成一个随机排列的简单算法,上面有很好的解释。不过,您仍然需要检查其唯一性

在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;
}
Random rand=new Random();
int[]生成置换(int n){
int[]res=新的int[n];
对于(int i=0;i

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

10必须是唯一的吗?或者重复的可能性可以吗?@Jokada是的,我需要它们是唯一的。如果你必须确保它是唯一的,你不能确保它是真正随机的……你的真实世界的起始数组长度是多少?@jball听起来很酷的一句话,但是一个基本的算法是生成随机序列,然后扔掉重复的序列,直到得到10个唯一的序列。你还认为这不能被认为是随机的吗?@Amir:这个答案太“进取”了,不能作为家庭作业提交当然,算法的问题是,它始终是相同的10个序列!因此,如果每次运行都需要一组不同的数字,您可能需要执行递归。@Amir有人将其标记为家庭作业,但不是OP,除此之外,没有人提到家庭作业,因此,尽管它很可能是,但也可能只是一个好奇的程序员提出的问题:)@Amir:不,不会。Java将根据需要自动为您的RNG设定种子:-派普。我被纠正了。洗牌在每次跑步中都会有所不同。很高兴知道。简单、便携、高效!