Gere um número binário aleatório com uma proporção variável de bits '1'
Eu preciso de uma função para gerar números inteiros aleatórios. (assuma o Javalong
digite por enquanto, mas isso será estendido paraBigInteger
ouBitSet
mais tarde.)
A parte complicada é que existe um parâmetro P que especifica a probabilidade (independente) de qualquer bit no resultado ser 1.
Se P = 0,5, podemos apenas usar o gerador de números aleatórios padrão. Alguns outros valores de P também são fáceis de implementar. Aqui está um exemplo incompleto:
Random random = new Random();
// ...
long nextLong(float p) {
if (p == 0.0f) return 0L;
else if (p == 1.0f) return -1L;
else if (p == 0.5f) return random.nextLong();
else if (p == 0.25f) return nextLong(0.5f) & nextLong(0.5f);
else if (p == 0.75f) return nextLong(0.5f) | nextLong(0.5f);
else if (p == 0.375f) return nextLong(0.5f) & nextLong(0.75f); // etc
else {
// What goes here??
String message = String.format("P=%f not implemented yet!", p);
throw new IllegalArgumentException(message);
}
}
Existe uma maneira de generalizar isso para qualquer valor de P entre 0,0 e 1,0?