1

I need the output of permutation for bits of length 3 to be (the order doesn't matter as the initial combination of 0 and 1 is generated randomly):

[0,0,0]

[0,0,1]

[0,1,0]

[0,1,1]

[1,0,0]

[1,0,1]

[1,1,0]

[1,1,1]

I have done but it seems that there are duplicates and some possible permutation are not being displayed which I'm not sure why. This is my code:

'

  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>();
    }

'

The output that I obtained is:

Added to bits #1: [0, 0, 1]

Added to bits #2: [1, 1, 0] - duplicate

Added to bits #3: [1, 0, 1]

Added to bits #4: [0, 0, 1]

Added to bits #5: [0, 0, 0] - dupicate

Added to bits #6: [1, 1, 0] - dupicate

Added to bits #7: [1, 1, 1]

Added to bits #8: [0, 0, 0] - dupicate

Therefore how can I obtain 8 different permutations as the bits are generated randomly? Please help.

Thank you.

ΦXocę 웃 Пepeúpa ツ
  • 47,427
  • 17
  • 69
  • 97
mina_mz
  • 59
  • 1
  • 7
  • Actually I misread the question. There has not permutations. Please rephrase the title. – Dici Jun 26 '16 at 19:58

2 Answers2

5

There's an easier way to go about this. Think of what these bits represent in binary, in unsigned two's complement:

  • [0,0,0] -> 0
  • [0,0,1] -> 1
  • [0,1,0] -> 2
  • ...
  • [1,1,1] -> 7

So the easy way to get all these permutations is:

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

Where does that 8 come from? It's just 2^3, since you wanted length 3.

This technique works for up to 31 bits, since Java's int type is signed (whereas the above basically treats it as unsigned, which works at those lower numbers).

You can bump it up to 2^63 by using long instead of int, and you can get 64-length by just enumerating all longs. Beyond that, you'll need a different approach; but 2^64 longs, at 8 bytes per long, is about 1.5e11 gigabytes -- so you'll have run out of RAM way before you need a more complex algorithm.

yshavit
  • 42,327
  • 7
  • 87
  • 124
3

If you are aware that the combinations is nothing else than counting then you can just do something like:

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

where Integer.toBinaryString(i) will print the i value as binary

and

String.format("%3s", Integer.toBinaryString(i)).replace(' ', '0')

will add leading zeros to the left so you can read it better

ΦXocę 웃 Пepeúpa ツ
  • 47,427
  • 17
  • 69
  • 97
  • Thank you. It worked! :) But is there a way from the strings, I would like each strings to be in array list. For example: 000 -> [0,0,0] 001 -> [0,0,1] and so on..? So it'll become [[0,0,0], [0,0,1],..] Thnx :) – mina_mz Jun 26 '16 at 20:11