随机初始化指定长度的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 BitSetlong[] 支持,所有位初始设置为 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);

学分: