Melhor maneira de calcular se há um 1/4 acaso algo vai acontecer em C ++?
-
11-07-2019 - |
Pergunta
Eu queria saber se existe uma maneira inteligente de descobrir
Há um 1/4 chance de algo acontecer.
Eu sei que podemos fazer isso com rand ()% 4 e verificar se ele é igual a 0, mas existe uma maneira sem o uso de rand ()? Em C ++, obrigado.
Nenhuma solução correta
Outras dicas
Se você quer dizer que você quer evitar o crappiness inerente de muitas implementações rand()
, você provavelmente deve olhar para Boost aleatório biblioteca , que tem várias PRNGs de alta qualidade (geradores de números pseudo-aleatórios), e muitas maneiras de controlar a saída. Esta biblioteca também está presente em forma ligeiramente modificada em std::tr1
.
Nunca sempre uso% para truncar um valor PRNG em um intervalo. A maioria dos PRNGs têm relativamente não-aleatórias bits de ordem mais baixos.
Para o seu caso, use uma divisão (RAND_MAX / n) como BCS sugere.
rand() < RAND_MAX/n;
escolher um rand melhor () do C de se você não gosta do padrão de C ().
Você pode escrever seu próprio rand. (Não fazê-lo).
Você poderia pegar o TickCount. (Não fazê-lo muitas vezes).
Você poderia simplesmente contar, e cada quarto retorno chamada verdadeira.
Você provavelmente deve apenas chamar rand ().
Eu não sei muito C ++, então eu poderia estar errado. Mas parece rand()
retornar um valor entre 0
e RAND_MAX-1
. Então talvez você poderia fazer algo parecido com isto:
double odds = .25;
if(rand() <= RAND_MAX * odds) {
// there should be .25 chance of entering this condition
}
PS:. Talvez isso requer algum fundição
Por que não usar rand ()? Se você está preocupado com a "verdadeira" aleatoriedade vs. pseudo aleatoriedade, você pode tentar usando fontes físicas de bits aleatórios . Muito mais complicado e, normalmente, desnecessário.
Você pode usar outro tipo de RNG como a Mersenne twister que tem entropia melhor global . Eu também coisa ouvir boa sobre Multuply com RNG Carry .
4 é um caso especial. Você pode assumir que o seu PRNG tem 50% de chances de produzir um número par, que é o caso - eu acho - para o LCG da libc (rand). A probabilidade de produzir um número par, por conseguinte, duas vezes é de 25%.
Portanto ...
bool rand_afourth(void)
{
return !!((rand() & 1) & (rand() & 1));
}
E agora para o pedante ...
O que você quer fazer é ter gerado um aleatória uniforme, mas restrito a um determinado intervalo, neste caso, uma entropia de 4. Se o PRNG tem, digamos, uma entropia de 32 bits, você não pode ter certeza de que calcular o mod de saída 4 funcionará como esperado. Isso requer um pouco mais de trabalho.
Felizmente, este trabalho já foi implementada na biblioteca de impulso.
boost::uniform_int<> aFourth(1,4)
E você, por exemplo, digamos sempre que "ok" você ganha 1 (ou 2, 3, 4, como você gosta).
Mas você não pode querer usar a biblioteca de impulso. Em seguida, basta olhada no código de uniform_int e reproduzir o comportamento. Talentos imitar, gênios roubar. ;)
Umm ... escrever seu próprio rand()
? Você vai precisar de alguns tipo de função aleatória!
Tente:
static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
// do something.
}
Em seguida, você vai encontrá-lo dá-lhe um 25% de probabilidade perfeita de algo acontecer (supondo que você executar a instrução if um múltiplo de quatro vezes.