Il modo migliore per calcolare se esiste una probabilità di 1/4 che accadrà in C ++?

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

  •  11-07-2019
  •  | 
  •  

Domanda

Mi chiedevo se esiste un modo intelligente per scoprirlo

C'è un 1/4 di possibilità che succeda qualcosa.

So che possiamo farlo con rand ()% 4 e verificando se è uguale a 0, ma c'è un modo senza usare rand ()? In c ++, grazie.

Nessuna soluzione corretta

Altri suggerimenti

Se vuoi dire che vuoi evitare la cattiveria intrinseca di molte rand() implementazioni, probabilmente dovresti esaminare la libreria Boost Random , che ha diversi pRNG di alta qualità (generatori di numeri pseudo-casuali) e molti modi per controllare l'output. Questa libreria è presente anche in forma leggermente modificata in std::tr1.

Mai mai utilizzare% per troncare un valore PRNG in un intervallo. La maggior parte dei PRNG ha bit di ordine inferiore relativamente non casuali.

Nel tuo caso, usa una divisione (RAND_MAX / n) come suggerisce BCS.

generatore di numeri casuali

rand() < RAND_MAX/n;

scegli un rand migliore () di C se non ti piace il rand standard di C ().

Potresti scrivere il tuo rand. (non farlo).
Potresti prendere il tickcount. (non farlo troppo spesso).
Potresti semplicemente contare e ogni quattro chiamate torneranno vere.

Probabilmente dovresti semplicemente chiamare rand ().

Non conosco molto C ++, quindi potrei sbagliarmi. Ma sembra rand() restituire un valore tra 0 e RAND_MAX-1. Quindi forse potresti fare qualcosa del genere:

double odds = .25;

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

PS: forse questo richiede un po 'di casting.

Perché non usare rand ()? Se sei preoccupato per & Quot; true & Quot; casualità vs. pseudo casualità, puoi provare utilizzando fonti fisiche di bit casuali . Molto più complicato e di solito non necessario.

È possibile utilizzare un altro tipo di RNG come Mersenne twister che ha una migliore entropia complessiva . Ho anche sentito parlare di Multuply with Carry RNGs

4 è un caso speciale. Puoi presumere che il tuo PRNG abbia il 50% di probabilità di emettere un numero pari, il che è il caso - credo - per il LCG della libc (rand). La probabilità di emettere due volte un numero pari è quindi del 25%.

Quindi ...

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

E ora per il pedante ...

Quello che vuoi fare è generare un casuale casuale generato, ma limitato a un certo intervallo, in questo caso un'entropia di 4. Se il tuo PRNG ha, diciamo, un'entropia di 32 bit, non puoi essere certo che il calcolo dell'uscita mod 4 funzionerà come previsto. Ciò richiede un po 'più di lavoro.

Fortunatamente, questo lavoro è già stato implementato nella libreria boost.

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

E ad esempio diresti " ok " ogni volta che ottieni 1 (o 2, 3, 4, come preferisci).

Ma potresti non voler usare la libreria boost. Quindi, guarda il codice di uniform_int e riprodurre il comportamento. I talenti imitano, i geni rubano. ;)

Umm ... scrivi il tuo rand()? Avrai bisogno di alcuni tipi di funzioni casuali!

Prova:

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

Quindi scoprirai che ti dà una probabilità del 25% perfetta di qualcosa che accade (supponendo che esegui l'istruzione if un multiplo di quattro volte.

&

lt; / dell'umorismo gt &;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top