Произвольная инициализация BitSet с определенной длиной - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть два набора битов, которые должны быть инициализированы случайным образом длиной 20 бит.

Я пытаюсь добиться этого, инициализируя битовые наборы по 20 бит каждый и в цикле for, проходящем по битовым наборам, и вызываю nextBoolean () из класса Random.Однако длина не всегда равна 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 голосов
/ 20 ноября 2018

Если я правильно понимаю, как заставить всегда иметь 20 случайных битов?

Измените ваши циклы 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);
}

BitSet поддерживается long[], и все биты изначально установлены на false, поэтому вызов BitSet#length не вернет значение 20, если не будет установлен 19-й бит, как указано вего документация :

Возвращает "логический размер" этого BitSet: индекс старшего установленного бита в BitSet плюс один.Возвращает ноль, если BitSet не содержит установленных битов.

Используя значение 20 в качестве условия в ваших циклах for, вы гарантируете, что первые 20 биты будут иметь возможностьбыть установленным случайным образом.

0 голосов
/ 20 ноября 2018

Если вы используете Java 7, вы можете инициализировать произвольный байтовый массив с помощью Random.nextBytes (byte []), а затем использовать статический метод BitSet.valueOf (byte []) для создания BitSet из того же байтового массива.

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

Кредиты для: https://stackoverflow.com/a/8566871/5133329

0 голосов
/ 20 ноября 2018

Почему бы не использовать 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);
}
...