J'ai deux BitSets qui doivent être initialisés au hasard avec une longueur de 20 bits.

J'essaie d'y parvenir en initialisant les BitSets avec 20 bits chacun et dans une boucle for itérant à travers les BitSets et en appelant nextBoolean () de la classe Random. Cependant, la longueur n'est pas toujours de 20. Donc, j'ai joué avec, et j'ai pensé que c'était peut-être parce qu'il ne compte pas les faux bits comme faisant partie de la longueur. Si je comprends bien, comment le forcer à toujours avoir 20 bits aléatoires?

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());
}

Merci d'avance.

1
Bab 20 nov. 2018 à 17:49

3 réponses

Meilleure réponse

Si je comprends bien, comment le forcer à toujours avoir 20 bits aléatoires?

Changez vos boucles for en:

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);
}

Un BitSet est soutenu par un long[] et tous les bits sont initialement définis sur false, donc appeler BitSet#length ne retournera pas la valeur 20 à moins que {{X5 }} Le bit est défini, comme indiqué par son documentation:

Renvoie la "taille logique" de ce BitSet: l'indice du bit le plus élevé défini dans le BitSet plus un. Renvoie zéro si le BitSet ne contient aucun bit défini.

En utilisant la valeur 20 comme condition dans vos boucles for, vous vous assurez que les premiers 20 bits auront l'opportunité d'être définis au hasard.

0
Jacob G. 20 nov. 2018 à 15:08

Si vous utilisez Java 7, vous pouvez initialiser un tableau d'octets aléatoires avec Random.nextBytes (byte []) puis utiliser la méthode statique BitSet.valueOf (byte []) pour créer un BitSet à partir du même tableau d'octets.

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

Crédits pour: https://stackoverflow.com/a/8566871/5133329

0
Josemy 20 nov. 2018 à 15:32

Pourquoi ne pas utiliser Bitset.valueOf(byte[] array) pour initialiser l'ensemble de bits à partir d'un tableau d'octets aléatoires?

Quelque chose comme:

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);
}
0
Guss 20 nov. 2018 à 15:04