如何在JAVA中获取0和1位的所有可能排列

时间:2016-06-26 19:06:41

标签: java random permutation bits

我需要输入长度为3的位的排列(顺序并不重要,因为0和1的初始组合是随机生成的):

  

[0,0,0]

     

[0,0,1]

     

[0,1,0]

     

[0,1,1]

     

[1,0,0]

     

[1,0,1]

     

[1,1,0]

     

[1,1,1]

我已经完成了但似乎有重复并且没有显示一些可能的排列,我不确定为什么。这是我的代码:

'

  ArrayList<Item> itemsAvailable = new ArrayList<Item>();
  ArrayList<Integer>bits = new ArrayList<Integer>();
  ArrayList<ArrayList<Integer>> tried = new ArrayList<ArrayList<Integer>>();

    itemsAvailable.add(new Item(5,4));
    itemsAvailable.add(new Item(12,10));
    itemsAvailable.add(new Item(8,5));

    System.out.println("itemsAvailable: " + itemsAvailable);

    Random r = new Random();

    //permutations
    for(int i = 0; i < Math.pow(2,itemsAvailable.size()); i++){
        //Generate random bits

        for(int j = 0; j < itemsAvailable.size(); j++){
            int x = 0;

            if (r.nextBoolean())
                x = 1;

            bits.add(x);

        }


        System.out.println("Added to bits #" + (i+1) + ": " + bits);

        bits = new ArrayList<Integer>();
    }

&#39;

我获得的输出是:

添加到位#1:[0,0,1]

添加到位#2:[1,1,0] - 重复

添加到第3位:[1,0,1]

添加到第4位:[0,0,1]

添加到第5位:[0,0,0] - 重复

添加到第6位:[1,1,0] - 重复

添加到第7位:[1,1,1]

添加到第8位:[0,0,0] - 重复

因此,当随机生成位时,如何获得8种不同的排列?请帮忙。

谢谢。

2 个答案:

答案 0 :(得分:4)

有一个更简单的方法来解决这个问题。想想这些位在二进制中表示的内容,在无符号二进制补码中:

  • [0,0,0] - &gt; 0
  • [0,0,1] - &gt; 1
  • [0,1,0] - &gt; 2
  • ...
  • [1,1,1] - &gt; 7

所以获得所有这些排列的简单方法是:

for (int i = 0; i < 8; ++i) {
    bits.add(i);
}

8来自哪里?它只是2 ^ 3,因为你想要长度为3。

这种技术最多可以工作31位,因为Java的int类型是有符号的(而上面基本上将它视为无符号,适用于那些较低的数字)。

你可以使用long而不是int来将它提升到2 ^ 63,只需枚举 all long就可以获得64长度。除此之外,你还需要一种不同的方法;但是2 ^ 64长,每长8个字节,大约是1.5e11千兆字节 - 所以在你需要更复杂的算法之前,你已经没有RAM了。

答案 1 :(得分:3)

如果您知道这些组合只是计数,那么您可以执行以下操作:

public static void main(String[] args) {
    for (int i = 0; i < 8; i++) {
        System.out.println(String.format("%3s", Integer.toBinaryString(i)).replace(' ', '0'));
    }
}

,其中 Integer.toBinaryString(i)会将i值打印为二进制

String.format(“%3s”,Integer.toBinaryString(i))。replace('','0')

会在左侧添加前导零,以便您更好地阅读