随机初始化具有特定长度的BitSet

时间:2018-11-20 14:49:52

标签: java bit bitset

我有两个BitSet,必须随机初始化,其长度为20位。

我正在尝试通过在循环中遍历BitSet并调用Random类的nextBoolean()的for循环中用每个20位初始化BitSet来实现这一点。但是,长度并不总是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());
}

谢谢。

3 个答案:

答案 0 :(得分:0)

为什么不使用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);
}

答案 1 :(得分:0)

  

如果我正确理解它,如何强制它始终具有20个随机位?

将for循环更改为:

SNP["pvals"] <- apply(SNP[ ,c(4:50)], MARGIN = 1, FUN = function(row) cor.test(vector, as.numeric(row), method='spearman', exact=FALSE)$p.value)

#SNP$pvals

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); } BitSet支持,并且所有位最初都设置为long[],因此调用false不会返回值BitSet#length,除非如其documentation所述,第20位被设置:

  

返回此BitSet的“逻辑大小”:BitSet中最高置位位的索引加1。如果BitSet不包含任何设置位,则返回零。

通过使用值19作为for循环的条件,您可以确保前20位将有机会被随机设置。

答案 2 :(得分:0)

如果您使用的是Java 7,则可以使用Random.nextBytes(byte [])初始化一个随机字节数组,然后使用静态BitSet.valueOf(byte [])方法从同一字节数组创建BitSet。 / p>

Random rnd = new Random();
// ...
byte[] randomBytes = new byte[NUM_BYTES];
rnd.nextBytes(randomBytes);
return BitSet.valueOf(randomBytes);

{@ {3}}

的积分