[esercizio c++]Dadi
due giocatori tirano a turno un dado:solo se il primo giocatore lancia un dado strettamente maggiore di quello del secondo giocatore vince.Bisogna simulare questa situazione per 100 volte e infine calcolare la probabilità di successo del primo giocatore.Mi aiutate a capire cos'è che non va?

#include <iostream> #include<cstdlib> #include<ctime> using namespace std; int main () { int a,b; float probvincita=0; const int i = 100; for (int j=0;j<100;j++) { srand(time(NULL)); a=1+rand()%6; b=1+rand()%6; if (a>b) { probvincita+=1; } } cout<<"Won probability: " <<(probvincita/i) <<"%" <<endl; return 0; }
Risposte
credo che l'errore stia in
a=1+rand()%6; b=1+rand()%6;perchè non so se posso assegnare a due variabili la stessa espressione(anche se in teoria il valore dell'espressione cambia ogni volta)
A me sembra che funzioni bene. Perchè dici che non va bene ?
Errori possibili a naso:
- casting vari non messi quando fai operazioni con float ed int
- srand() chiamato ad ogni ciclo può portare a risultati sempr euguali quando chiami rand() per via del seme
- casting vari non messi quando fai operazioni con float ed int
- srand() chiamato ad ogni ciclo può portare a risultati sempr euguali quando chiami rand() per via del seme
"hamming_burst":
l'unica cosa che potrebbe non essere corretto (nel codice) è chiamare ad ogni ciclosrand(time(NULL));
il tempo del seme potrebbe portare a risultati tutti uguali, mi sembra.
Immagino anche io sia lì... Comunque strano problema. Immagino che sia perché le chiamate a time sono troppo vicine tra di loro e quindi inizializza con lo stesso valore quasi tutti i casi. Il resto mi pare corretto anche se forse metterei j
@vict85: scusa ho editato il messaggio prima che tu postassi, mi era venuto in mente altro 
per il seme, è duvuto proprio a quello che dici, il tempo di chiamata è troppo vicino si parla di nano/micro-secondi o giù di li, e time si ferma prima (ai centesimi?), perciò il seme è sempre lo stesso
per risolvere si potrebbe o aggiungere un fattore diverso ad ogni ciclo:
o ad un tot di iterazioni richiamare la funzione srand() tipo a $n/2$
comunque rinoto ora
è inutile dichiararlo float. alla fine è un contatore basta un intero ed i casting non esistono

per il seme, è duvuto proprio a quello che dici, il tempo di chiamata è troppo vicino si parla di nano/micro-secondi o giù di li, e time si ferma prima (ai centesimi?), perciò il seme è sempre lo stesso

per risolvere si potrebbe o aggiungere un fattore diverso ad ogni ciclo:
srand(time(NULL)+j)
o ad un tot di iterazioni richiamare la funzione srand() tipo a $n/2$
comunque rinoto ora
float probvincita=0
è inutile dichiararlo float. alla fine è un contatore basta un intero ed i casting non esistono

La risposta pare te l'abbiano gia' data, rispondo solo un po' OT per proporre una lettura interessante.
Perche' dici cio' ?
Quando fai una assegnazione ad una variabile di una espressione e' come se mettessi il risultato di quell'espressione in una scatolina. Ogni volta che valuti un'espressione ottieni un nuovo valore da mettere in una scatolina.
Non e' che ti stai facendo fuorviare da una superficiale somiglianza dell'assegnazione in C/C++ con l'eguaglianza matematica?
Lo dico perche' questa tua frase mi ricorda da vicino cio' che viene raccontato in questo link.
PS Ovviamente parlo genericamente, non intendendo alludere a niente delle tue capacita' di programmare che non conosco...visto il titolo della pagina che ho linkato non vorrei che qualcuno fraintendesse
"Mifert4":
credo che l'errore stia ina=1+rand()%6; b=1+rand()%6;perchè non so se posso assegnare a due variabili la stessa espressione(anche se in teoria il valore dell'espressione cambia ogni volta)
Perche' dici cio' ?
Quando fai una assegnazione ad una variabile di una espressione e' come se mettessi il risultato di quell'espressione in una scatolina. Ogni volta che valuti un'espressione ottieni un nuovo valore da mettere in una scatolina.
Non e' che ti stai facendo fuorviare da una superficiale somiglianza dell'assegnazione in C/C++ con l'eguaglianza matematica?
Lo dico perche' questa tua frase mi ricorda da vicino cio' che viene raccontato in questo link.
PS Ovviamente parlo genericamente, non intendendo alludere a niente delle tue capacita' di programmare che non conosco...visto il titolo della pagina che ho linkato non vorrei che qualcuno fraintendesse

"Quinzio":
A me sembra che funzioni bene. Perchè dici che non va bene ?
Perchè ogni volta eseguo il programma le probabilità di vincita sono o 1 o 0,mentre io mi aspetterei cose del tipo 23%,76%,3,5% ecc..Ma a questo punto mi "autoviene" un dubbio: o ho sbagliato formula o non ho capito la richiesta dell'esercizio.
edit:per caso i valori della probvincita dovrebbero variare tra 0 e 1?
"Mifert4":
[quote="Quinzio"]A me sembra che funzioni bene. Perchè dici che non va bene ?
Perchè ogni volta eseguo il programma le probabilità di vincita sono o 1 o 0,mentre io mi aspetterei cose del tipo 23%,76%,3,5% ecc..Ma a questo punto mi "autoviene" un dubbio: o ho sbagliato formula o non ho capito la richiesta dell'esercizio.
edit:per caso i valori della probvincita dovrebbero variare tra 0 e 1?[/quote]
Per avere quello devi moltiplicare per cento altrimenti ti scriverà 0,23% e cose così anche se non sono percentuali ma probabilità in senso della teoria della probabilità (la probabilità di un evento è un numero tra 0 e 1). Le percentuali sono legate a queste semplicemente perché sono moltiplicate per 100 e quindi sono numeri che vanno tra 0 e 100 invece che tra 0 e 1.
Nel tuo caso puoi anche non dividere per i=100 ma puoi anche fare la moltiplicazione e divisione per 100 se vuoi permettere che i possa essere cambiata. In ogni caso in realtà probvincita può benissimo anche essere un int.
"Mifert4":
[quote="Quinzio"]A me sembra che funzioni bene. Perchè dici che non va bene ?
Perchè ogni volta eseguo il programma le probabilità di vincita sono o 1 o 0,mentre io mi aspetterei cose del tipo 23%,76%,3,5% ecc..Ma a questo punto mi "autoviene" un dubbio: o ho sbagliato formula o non ho capito la richiesta dell'esercizio.
edit:per caso i valori della probvincita dovrebbero variare tra 0 e 1?[/quote]
Le percentuali che devi vedere sono attorno al 41%, che corrispondono ai 15 casi "positivi" sulle 36 combinazioni del lancio di due dadi. $(15)/(36) = 0.41\%$
Ho fatto girare il tuo progrtamma con CodeBlocks è in effetti restituisce sempre 41%.
Credo che la funzione random non restituisca dei valori veramente randomici, ma questo è un problema sottile che è noto con le simulazioni.
Secondo me, per quello che devi fare tu, il programma va bene.
Fai solo attenzione ai casting, perchè sono difficili da debuggare.
Ciao! Sono il tuo Tutor AI, il compagno ideale per uno studio interattivo. Utilizzo il metodo maieutico per affinare il tuo ragionamento e la comprensione. Insieme possiamo:
- Risolvere un problema di matematica
- Riassumere un testo
- Tradurre una frase
- E molto altro ancora...
Il Tutor AI di Skuola.net usa un modello AI di Chat GPT.
Per termini, condizioni e privacy, visita la relativa pagina.
Per termini, condizioni e privacy, visita la relativa pagina.