随机初始化指定长度的BitSet
Randomly initialize BitSet with specific length
我有两个 BitSet,它们必须随机初始化,长度为 20 位。
我试图通过初始化每个 20 位的 BitSet 并在 for 循环中遍历 BitSet 并调用 Random class 的 nextBoolean() 来实现这一点。然而,长度并不总是 20。所以,我一直在玩弄它,并认为这可能是因为它没有将错误位计算为长度的一部分。如果我理解正确,我如何强制它始终具有 20 个随机位?
public static void generate() {
BitSet set1 = new BitSet(20);
BitSet set2 = new BitSet(20);
Random r = new SecureRandom();
for (int i = 0; set1.length() < 20 && set2.length() < 20; i++) {
set1.set(i, r.nextBoolean());
set2.set(i, r.nextBoolean());
}
StringBuilder s = new StringBuilder();
for (int i = 0; i < set1.length(); i++) {
s.append(temp1.get(i) == true ? 1 : 0);
}
System.out.println(s + " " + s.length() + " " + set1.length() + " "+ set2.length());
}
提前致谢。
为什么不使用 Bitset.valueOf(byte[] array)
从随机字节数组初始化位集?
类似于:
public BitSet getBits(SecureRandom sr, int size) {
byte[] ar = new byte[(int) Math.ceil(size / 8F)];
sr.nextBytes(ar);
return BitSet.valueOf(ar).get(0, size);
}
In case I understand it correctly, how do I force it to have 20 random bits always?
将您的 for 循环更改为:
for (int i = 0; i < 20; i++) {
set1.set(i, r.nextBoolean());
set2.set(i, r.nextBoolean());
}
...
for (int i = 0; i < 20; i++) {
s.append(temp1.get(i) == true ? 1 : 0);
}
A BitSet
由 long[]
支持,所有位初始设置为 false
,因此调用 BitSet#length
不会 return 值 20
除非碰巧设置了第 19
位,如其 documentation:
所述
Returns the "logical size" of this BitSet: the index of the highest set bit in the BitSet plus one. Returns zero if the BitSet contains no set bits.
通过使用值 20
作为 for 循环中的条件,您可以确保前 20
位有机会被随机设置。
如果你使用的是Java7,你可以用Random.nextBytes(byte[])初始化一个随机字节数组,然后使用静态BitSet.valueOf(byte[])方法来从相同的字节数组创建一个 BitSet。
Random rnd = new Random();
// ...
byte[] randomBytes = new byte[NUM_BYTES];
rnd.nextBytes(randomBytes);
return BitSet.valueOf(randomBytes);
学分:
我有两个 BitSet,它们必须随机初始化,长度为 20 位。
我试图通过初始化每个 20 位的 BitSet 并在 for 循环中遍历 BitSet 并调用 Random class 的 nextBoolean() 来实现这一点。然而,长度并不总是 20。所以,我一直在玩弄它,并认为这可能是因为它没有将错误位计算为长度的一部分。如果我理解正确,我如何强制它始终具有 20 个随机位?
public static void generate() {
BitSet set1 = new BitSet(20);
BitSet set2 = new BitSet(20);
Random r = new SecureRandom();
for (int i = 0; set1.length() < 20 && set2.length() < 20; i++) {
set1.set(i, r.nextBoolean());
set2.set(i, r.nextBoolean());
}
StringBuilder s = new StringBuilder();
for (int i = 0; i < set1.length(); i++) {
s.append(temp1.get(i) == true ? 1 : 0);
}
System.out.println(s + " " + s.length() + " " + set1.length() + " "+ set2.length());
}
提前致谢。
为什么不使用 Bitset.valueOf(byte[] array)
从随机字节数组初始化位集?
类似于:
public BitSet getBits(SecureRandom sr, int size) {
byte[] ar = new byte[(int) Math.ceil(size / 8F)];
sr.nextBytes(ar);
return BitSet.valueOf(ar).get(0, size);
}
In case I understand it correctly, how do I force it to have 20 random bits always?
将您的 for 循环更改为:
for (int i = 0; i < 20; i++) {
set1.set(i, r.nextBoolean());
set2.set(i, r.nextBoolean());
}
...
for (int i = 0; i < 20; i++) {
s.append(temp1.get(i) == true ? 1 : 0);
}
A BitSet
由 long[]
支持,所有位初始设置为 false
,因此调用 BitSet#length
不会 return 值 20
除非碰巧设置了第 19
位,如其 documentation:
Returns the "logical size" of this BitSet: the index of the highest set bit in the BitSet plus one. Returns zero if the BitSet contains no set bits.
通过使用值 20
作为 for 循环中的条件,您可以确保前 20
位有机会被随机设置。
如果你使用的是Java7,你可以用Random.nextBytes(byte[])初始化一个随机字节数组,然后使用静态BitSet.valueOf(byte[])方法来从相同的字节数组创建一个 BitSet。
Random rnd = new Random();
// ...
byte[] randomBytes = new byte[NUM_BYTES];
rnd.nextBytes(randomBytes);
return BitSet.valueOf(randomBytes);
学分: