La mejor manera de calcular si hay un 1/4 posibilidad de que algo va a suceder en C++?

StackOverflow https://stackoverflow.com/questions/326797

  •  11-07-2019
  •  | 
  •  

Pregunta

Me preguntaba si hay una forma inteligente de encontrar

Hay un 1/4 posibilidad de que algo sucede.

Sé que podemos hacerlo con la función rand() % 4 y comprobar si es igual a 0, pero hay una manera sin el uso de la función rand()?En c++, gracias.

No hay solución correcta

Otros consejos

Si quiere decir que quiere evitar la inherente basura de muchas rand() implementaciones, probablemente debería buscar en la biblioteca Boost Random , que tiene varios pRNG de alta calidad (generadores de números pseudoaleatorios) y muchas formas de controlar la salida. Esta biblioteca también está presente en forma ligeramente modificada en std::tr1.

Nunca nunca use% para truncar un valor PRNG en un rango. La mayoría de los PRNG tienen bits de orden inferior relativamente no aleatorios.

Para su caso, use una división (RAND_MAX / n) como sugiere BCS.

generador de números aleatorios

rand() < RAND_MAX/n;

elige un mejor rand () que C's si no te gusta el rand estándar de C ().

Podrías escribir tu propio rand. (no lo hagas).
Podrías agarrar el tickcount. (no lo hagas con demasiada frecuencia).
Podrías contar y cada cuarta llamada devuelve verdadero.

Probablemente deberías llamar a rand ().

No sé mucho de C++, por lo que yo podría estar equivocado.Pero parece rand() devuelve un valor entre 0 y RAND_MAX-1.Así que tal vez podría hacer algo como esto:

double odds = .25;

if(rand() <= RAND_MAX * odds) {
    // there should be .25 chance of entering this condition
}

PS:Tal vez esto requiere de una fundición.

¿Por qué no usar rand ()? Si le preocupa & Quot; verdadero & Quot; aleatoriedad versus seudoaleatoriedad, puede intentar usando fuentes físicas de bits aleatorios . Mucho más complicado, y generalmente innecesario.

Podría usar otro tipo de RNG como el Mersenne twister que tiene una mejor entropía general . También escuché algo bueno acerca de Multuply with Carry RNGs.

4 es un caso especial. Puede suponer que su PRNG tiene un 50% de posibilidades de generar un número par, que es el caso, creo, para el LCG de la libc (rand). La probabilidad de generar un número par dos veces es, por lo tanto, del 25%.

Por lo tanto ...

bool rand_afourth(void)
{
    return !!((rand() & 1) & (rand() & 1));
}

Y ahora para los pedantes ...

Lo que desea hacer es generar un uniforme aleatorio uniforme, pero restringido a un cierto rango, en este caso una entropía de 4. Si su PRNG tiene, por ejemplo, una entropía de 32 bits, no puede estar seguro de que calcular la salida mod 4 funcionará como se esperaba. Esto requiere un poco más de trabajo.

Afortunadamente, este trabajo ya se ha implementado en la biblioteca de impulso.

boost::uniform_int<> aFourth(1,4)

Y, por ejemplo, diría " ok " cada vez que obtienes 1 (o 2, 3, 4, según lo desees).

Pero es posible que no desee utilizar la biblioteca de impulso. Luego, simplemente mire el código de uniform_int y reproducir el comportamiento Los talentos imitan, los genios roban. ;)

Umm ... ¿escribe su propia rand()? ¡Necesitará algún tipo de función aleatoria!

Prueba:

static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
    // do something.
}

Entonces descubrirá que le brinda una probabilidad perfecta del 25% de que algo suceda (suponiendo que ejecute la instrucción if un múltiplo de cuatro veces.

< / humor >

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top