如何获得 JAVA 中 0 和 1 位的所有可能排列
How to get all possible permutations for 0 and 1 bits in JAVA
我需要长度为 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>();
}
'
我得到的输出是:
添加到第 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,0,0] -> 0
- [0,0,1] -> 1
- [0,1,0] -> 2
- ...
- [1,1,1] -> 7
所以获得所有这些排列的简单方法是:
for (int i = 0; i < 8; ++i) {
bits.add(i);
}
8
是从哪里来的?它只是 2^3,因为你想要长度 3。
此技术最多适用于 31 位,因为 Java 的 int 类型是有符号的(而上面基本上将其视为无符号,适用于那些较低的数字)。
您可以通过使用 long 而不是 int 将其增加到 2^63,并且您可以通过枚举 all 长整数来获得 64 位长度。除此之外,您还需要一种不同的方法;但是 2^64 长,每个长 8 个字节,大约是 1.5e11 千兆字节——所以在你需要一个更复杂的算法之前,你会 运行 内存不足。
如果您知道组合只是计数,那么您可以这样做:
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')
将在左侧添加前导零,以便您更好地阅读
我需要长度为 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>();
}
'
我得到的输出是:
添加到第 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,0,0] -> 0
- [0,0,1] -> 1
- [0,1,0] -> 2
- ...
- [1,1,1] -> 7
所以获得所有这些排列的简单方法是:
for (int i = 0; i < 8; ++i) {
bits.add(i);
}
8
是从哪里来的?它只是 2^3,因为你想要长度 3。
此技术最多适用于 31 位,因为 Java 的 int 类型是有符号的(而上面基本上将其视为无符号,适用于那些较低的数字)。
您可以通过使用 long 而不是 int 将其增加到 2^63,并且您可以通过枚举 all 长整数来获得 64 位长度。除此之外,您还需要一种不同的方法;但是 2^64 长,每个长 8 个字节,大约是 1.5e11 千兆字节——所以在你需要一个更复杂的算法之前,你会 运行 内存不足。
如果您知道组合只是计数,那么您可以这样做:
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')
将在左侧添加前导零,以便您更好地阅读