我需要输入长度为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种不同的排列?请帮忙。
谢谢。
答案 0 :(得分:4)
有一个更简单的方法来解决这个问题。想想这些位在二进制中表示的内容,在无符号二进制补码中:
所以获得所有这些排列的简单方法是:
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')
会在左侧添加前导零,以便您更好地阅读