Il modo migliore per calcolare se esiste una probabilità di 1/4 che accadrà in C ++?
-
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.
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.
< / dell'umorismo gt &;