2015-01-07 11 views
7

Ho un sistema di "battaglia", l'attaccante ha una forza di battaglia di, ad es. 100, il difensore ha una forza di es. 75.Probabilità di vincere il calcolo percentuale PHP

Ma ora sono bloccato, non riesco a capire come trovare il vincitore. So che l'autore dell'attacco ha una probabilità del 25% di perdere, ma non riesco a capire la sceneggiatura.

Qualche idea?

+0

http://php.net/manual/en/function.rand.php potrebbe aiutarti qui. –

+0

Solo per curiosità: se sia l'attaccante che il difensore hanno un valore di 100, cosa succede? (o è proibito in qualche modo?) – VolkerK

risposta

15

Estrarre un numero casuale tra 0...100 o se si preferisce 0...1.
Controllare se questo numero è inferiore a 75. Se è quindi l'attaccante ha vinto.

$p = rand(0,99); 
if ($p<75) 
    // Attacker Won! 

Questo ha un'interpretazione probabilistica molto spinto in avanti. se estrai a caso un numero compreso tra 0...100 hai il 75% di possibilità che il numero sia inferiore a 75. Esattamente quello che ti serve.

In questo caso è sufficiente la funzione rand(). Notate anche che cosa suggerito da @Marek, la possibilità di vincere per l'attaccante può essere molto inferiore al 75%. (leggi la risposta di Marek che indica una probabilità del 57% di vincere).

Il problema si porrà quando hai bisogno di modellare la funzione di densità di probabilità più complesso, ad esempio:

enter image description here

In questo caso sarà necessario un modello più complesso, come un gaussian mixture.

+0

Certo, stavo pensando a un modo complicato, ma è così semplice. Ottimo lavoro, grazie! – Sims

+0

Ah, bastonatemi. –

+0

Dovresti controllare la risposta di @ Marek. Qui un difensore più debole ha una probabilità del 75% di vincere. Questo è decisamente sbagliato. – jeroen

1

utilizzo di un generatore di numeri casuali, è possibile creare una funzione come ad esempio:

function chance($percent) { 
    return mt_rand(0, 99) < $percent; 
} 

quindi è possibile utilizzare la funzione ovunque. Nota: mt_rand presumibilmente genera numeri casuali migliori.

3

La possibilità di vincere il giocatore A contro B è A/(A + B), questo è per qualsiasi numero e qualsiasi scala. Quindi utilizzare la risposta dinamica per calcolare il risultato effettivo.

Per esempio:

$c = (75/(100+75)); // 0.42857142857142857143 
$Awon = mt_rand(0, 9999) < ($c * 10000); 
+2

Questa sembra essere l'unica risposta corretta per quanto riguarda la matematica. – jeroen

+1

Non va bene, il giocatore A ha una probabilità del 75% di vincere e 100/(100 + 75) = 0,57, o il 57%. – Styphon

+0

@Styphon Sono 75 punti, non le percentuali. Il punteggio totale in gioco è 175, il giocatore A ha 75 del totale. – Marek

3

Se dovessi pop questo in codice come una funzione utile:

function attack($attack, $defend) 
{ 
    return (mt_rand(1, $attack) > $defend); 
} 

$attack = 100; 
$defend = 75; 

var_dump(attack(100,75)); 

restituirà semplicemente vero o falso, come richiesto. Passa in qualsiasi valore tu abbia bisogno.