Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- // Il codice può essere eseguito qui:
- // http://www.tutorialspoint.com/execute_php_online.php
- //
- // Dato i valori presenti sulle facce di un dado e il numero di lanci
- // (o di dadi lanciati contemporaneamente) il codice determina tutte
- // le possibili somme ottenibili e le loro probabilità.
- //
- // Costanti
- define ("CRLF", "\n"); // "\n" o "<br>" (accapo)
- define ("DEBUG", 0); // 0, 2, 5, 10 (0 = no Debug mode)
- //
- // * Variabili (dati del problema) *
- // Vettore con i valori delle facce del dado
- // Le facce possono avere un numero di facce variabile con valori anche
- // ripetuti o non sequenziali (es [0,4,5,5])
- $dado = array(0,0,1,2,3,4);
- // Numero di dadi (o di lanci)
- $numeroDadi = 5;
- //
- // * Funzioni *
- //
- // Funzione ricorsiva che calcola le probabilità delle somme di (0..n) dadi
- // - gli indici di vecValoriEProb sono i numeri presenti sulle facce (se si ripetono vengono presi una volta sola)
- // - i valori di vecValoriEProb indicano la probabilità relativa al valore indice.
- // Per calcolare tutte le somme di un dado di 5 valori (0,1,2,3,4) eseguirà 155 cicli
- // (1*5 + 5*5 + 9*5 + 16*5 cicli, vale a dire 5 + 25 + 45 + 80)
- function calcProbSomme($vecValoriEProb, $numeroDadi) {
- if ($numeroDadi > 0) {
- $vecProbSommePrec = calcProbSomme($vecValoriEProb, $numeroDadi-1); // La funzione si richiama ricorsivamente
- if (DEBUG >= 5) { print_array("Prec: ", $vecProbSommePrec); }
- $vecProbSomme = array();
- // Scandisco tutte le somme già ottenute sommando alle stesse tutti i possibili valori di un dado
- // Esempio: al primo dado ho solo la somma "0", con probabilità 1; se sommo un 1 con probabilità 1/6 ne
- // consegue una nuova somma "1" con probabilità 1*1/3
- // Ciclo che scandisce le 'somme precedenti'
- foreach($vecProbSommePrec as $s0 => $p0) {
- if (DEBUG >= 5) { echo "Somma ". $s0 . " prob. " . $p0 . CRLF; }
- // Ciclo che somma, uno per uno, i vari valori del dado e determina le probabilità di ciascuna somma
- // NOTA: le probabilità di 0+3 o 1+2 o 2+1 o 3+0 andranno tutte a sommarsi nell'elemento '3' del vettore delle probabilità
- foreach($vecValoriEProb as $vf => $pv) {
- if (empty($vecProbSomme[$s0 + $vf])) { $vecProbSomme[$s0 + $vf] = 0; } // creo il nuovo elemento se non c'è ancora
- // $s0 (somma precedente); $vf (valore faccia); $p0 (probabilità di somma prec); $pv (probabilità del valore faccia)
- $vecProbSomme[$s0 + $vf] = $vecProbSomme[$s0 + $vf] + $p0 * $pv;
- }
- }
- if (DEBUG >= 5) { print_array("Post: ", $vecProbSomme); }
- } else {
- // nunero dadi = 0 - inizializzo il vettore delle somme (l'unica somma possibile è 0, con probabilità 1) e lo ritorno
- $vecProbSomme = array();
- $vecProbSomme[0] = 1; // solo il valore 0 ha probailità 1 all'inizio
- }
- if (DEBUG >= 5) { echo("calcProbSomme - Dado " . $numeroDadi . CRLF); }
- return $vecProbSomme;
- }
- //
- // Funzione che elenca gli elementi di un vettore di tipo indice => valore
- function print_array($titolo, $a) {
- echo(CRLF . $titolo . CRLF);
- foreach($a as $i => $v) {
- echo($i . " [" . number_format($v, 3) . "]" . CRLF);
- }
- echo CRLF;
- }
- //
- // * Main *
- //
- $probSomme = array(); // raccoglie le probabilità delle somme possibili
- $probValoreFacce = array();
- //
- echo("**** Calcolo probabilità di somme di dadi 'arbitrari' ****" . CRLF . CRLF);
- if (DEBUG > 0) {echo("Modo DEBUG = " . DEBUG . CRLF); }
- // le dacce sono equiprobabili (i valori no, se appaiono su più facce)
- $facceDado = count($dado);
- $probFacciaDado = 1 / $facceDado;
- // Calcolo probabilità di ciascun valore
- for($x = 0; $x < $facceDado; $x++) {
- $prob0=0;
- if (!empty($probValoreFacce[$dado[$x]])) {
- $prob0 = $probValoreFacce[$dado[$x]];
- }
- $probValoreFacce[$dado[$x]] = $prob0 + $probFacciaDado;
- }
- // Mostra facce del dado (se true)
- if (DEBUG >= 2) {
- echo("Facce del dado" . CRLF);
- foreach($dado as $x => $x_value) {
- echo( "Faccia: " . $x . ", Valore: " . $x_value . CRLF);
- }
- }
- // Mostra probabilità dei valori (unici) delle facce (se true)
- if (DEBUG >= 2) {
- echo(CRLF);
- echo("Probabilità dei valori delle facce del dado" . CRLF);
- foreach($probValoreFacce as $x => $x_value) {
- echo("Valore: " . $x . ", Probabilità: " . $x_value . CRLF);
- }
- echo(CRLF);
- }
- // Calcola le probabilità di ciascuna somma ottenibile riportando un
- $probSomme = calcProbSomme($probValoreFacce, $numeroDadi);
- // Mostra le possibili somme e le rispettiva probabilità
- if (true) {
- echo("Probabilità delle possibili somme" . CRLF);
- foreach($probSomme as $s => $ps) {
- echo("Somma: " . $s . ", Probabilità: " . $ps . CRLF);
- }
- echo CRLF;
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement