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?

questionAnswers(7)

yourAnswerToTheQuestion