如何在java中创建12个红色和12个蓝色球的所有可能排列

如何在java中创建12个红色和12个蓝色球的所有可能排列,java,arrays,combinations,Java,Arrays,Combinations,我有12个蓝球和12个红球,现在我想创造这一切可能的安排。在java中,我想创建一系列像这样的可能安排 [1,1,2,1,2,1,2,2,1,1,2,1,2,1,1,2,1,2,1,1,2,2,2,2] 1代表红色,2代表蓝色。我想以数组的形式创建所有这些可能的组合 有什么有效的方法吗?试试这个 static void perm(int red, int blue, int max, int i, int[] result) { if (i >= max) { S

我有12个蓝球和12个红球,现在我想创造这一切可能的安排。在java中,我想创建一系列像这样的可能安排

[1,1,2,1,2,1,2,2,1,1,2,1,2,1,1,2,1,2,1,1,2,2,2,2]
1代表红色,2代表蓝色。我想以数组的形式创建所有这些可能的组合

有什么有效的方法吗?

试试这个

static void perm(int red, int blue, int max, int i, int[] result) {
    if (i >= max) {
        System.out.println(Arrays.toString(result));
        return;
    }
    if (red > 0) {
        result[i] = 1;
        perm(red - 1, blue, max, i + 1, result);
    }
    if (blue > 0) {
        result[i] = 2;
        perm(red, blue - 1, max, i + 1, result);
    }
}

static void perm(int red, int blue) {
    perm(red, blue, red + blue, 0, new int[red + blue]);
}

public static void main(String[] args) {
    perm(12, 12);
}

它是在24个:组合中选择12个元素

那么您就得到了2704156个结果。

1只需使用组合:

您可以使用任何库来生成组合。像我一样:

取24个位置(0到23)的向量,只需选择12个

这为您提供了所有可能的选择:

Vector<Integer> pos=new Vector<Integer>();
for (int i=0;i<24;i++)
    pos.add(i);

// Combinations 5 between 24
Vector<Vector<Integer>> combine=Combinatorics.combinaisons(pos, 5);

System.out.println("COMBINE "+combine.size());

for (int k=0;k<combine.size()<10;k++)
    System.out.println(combine.get(k)); 
    // You have the positions => convert to your format
Vector pos=new Vector();
对于(int i=0;i>i)&1)!=0)
比特集(i);
返回位集;
}   
整数合计=24;
int多少=12;
整数计数=0;
int max=(int)数学功率(2.0,总计);
用于(int i=0;i)并转换为您的格式
系统输出打印项次(位集);
计数++;
}
}
System.out.println(“计数:+COUNT”);

检查两件事:这是一个由24个元素组成的集合的排列,集合的大小是24!(24个阶乘,或~620个十六进制组合)。取决于生成它的方式,您可能没有足够的内存来完成它。@Makoto这不是排列。请看我的答案。您的代码非常有效,但缺少一些解释。
public static BitSet bitsSet(long num)
{
BitSet bitSet = new BitSet();
for (int i = 0; i < 64; i++)
    if (((num >>> i) & 1) != 0)
            bitSet.set(i);
return bitSet;
}   

int total=24;
int how_many=12;

int count=0;

int max=(int) Math.pow(2.0,total);
for (int i=0;i<max;i++)
    {
    BitSet bitset=bitsSet(i);
    if (bitset.cardinality()==how_many)
        {
        // get the bits => and convert to your format
        System.out.println(bitset);
        count++;
        }
    }

System.out.println("COUNT:"+count);