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.

gerador de números aleatórios

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top