我有两个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());
}
谢谢。
答案 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}}
的积分