[C] Probabilità lancio monete

di il
13 risposte

[C] Probabilità lancio monete

Salve a tutti, ho un problema con un programma. Devo calcolare la stima di una simulazione di lancio di n monete e vedere in quanti lanci sono uscite k teste su un totale di 1000 simulazioni. Il programma mi sembra giusto, infatti se stampo "simula_lancio" e "simula_lanci_multipli" escono corretti, il problema è nel formato dello "stima_probabilità" che mi ritorna sempre 0. Sicuramente avrò sbagliato con i float, qualcuno può indicarmi dove?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int simula_lancio ();
int simula_lanci_multipli(int monete);
float stima_lanci (int teste);

int main() {

int n,k;

srand(time(NULL));

printf("Inserisci il numero delle monete da lanciare:");
scanf("%i", &n);

printf("Inserisci il numero delle teste che vuoi verificare:");
scanf("%i", &k);

printf("[Simula]\n");
printf("%i\n", simula_lancio());

printf("[Lancio N]\n");
printf("%i\n", simula_lanci_multipli(n));



printf("[STIMA]\n");
printf("%f\n", stima_lanci(k));

return 0;

}


int simula_lancio (){ //simula il lancio di una singola moneta
	int c=0;
	if (rand () % 2 == 0) return c; //testa
	
}

int simula_lanci_multipli (int monete) { //simula un singolo lancio di n monete

	int i=1,a=0,p=1;
	
	while(i<=monete) {
		if (p==simula_lancio ()) a++; //se ottengo testa incremento la variabile
		i++; }
		
	return a; //restituisce il valore di quante teste ho trovato in un singolo lancio
}

float stima_lanci (int teste) { //effettuo 1000 lanci e vedo quante volte coincidono

	int r=1000;
	int j;
	float nlanci=0;
	float prob=0;
	int l;
	
	for(j=1;j<=r;j++) { 
	
		if(teste==simula_lanci_multipli(l)) nlanci++;} //se il valore è uguale a quello previsto salvo il numero

	prob=nlanci/r;
	
	return prob;	
}

13 Risposte

  • Re: [C] Probabilità lancio monete

    Scusa e se rand()%2!=0 cosa ritorni dal lancio singolo...?
  • Re: [C] Probabilità lancio monete

    ANDPRI ha scritto:


    Scusa e se rand()%2!=0 cosa ritorni dal lancio singolo...?
    Me lo scarta, a me serve sapere solo quante "teste" trova non le croci.
  • Re: [C] Probabilità lancio monete

    Si ma dovresti comunque far ritornare qualcosa, e poi in stima_lanci inizializzi l ma non assegni nessun valore, e poi la usi come argomento per simula_lanci_multipli
  • Re: [C] Probabilità lancio monete

    Ok ho appena provato il programma e mi sto chiedendo: "ma come ho fatto a non accorgermene prima?" È un errore così evidente e ce l'avevo sotto il naso! Scusa, se tu da simula_lancio() ritorni solo 0 o niente (il che è comunque sbagliato) come pretendi che in simula_lanci_multipli() p sia uguale a simula_lancio(), se p è 1?
  • Re: [C] Probabilità lancio monete

    ANDPRI ha scritto:


    Ok ho appena provato il programma e mi sto chiedendo: "ma come ho fatto a non accorgermene prima?" È un errore così evidente e ce l'avevo sotto il naso! Scusa, se tu da simula_lancio() ritorni solo 0 o niente (il che è comunque sbagliato) come pretendi che in simula_lanci_multipli() p sia uguale a simula_lancio(), se p è 1?
    Allora, stima lanci e stima lanci multipli se hai provato il programma escono corretti, cioè randomici. Il problema si pone nella stima della probabilità.
    Per il fatto del ritorno 0, il ragionamento è questo: p é uguale ad 1, eseguo la funzione simula lancio, se esce uno la condizione dell'if è vera e quindi salvo il valore di testa, se no scarto ed incremento i, vado avanti e ripeto il procedimento per n monete.
  • Re: [C] Probabilità lancio monete

    Fabio96 ha scritto:


    ANDPRI ha scritto:


    Ok ho appena provato il programma e mi sto chiedendo: "ma come ho fatto a non accorgermene prima?" È un errore così evidente e ce l'avevo sotto il naso! Scusa, se tu da simula_lancio() ritorni solo 0 o niente (il che è comunque sbagliato) come pretendi che in simula_lanci_multipli() p sia uguale a simula_lancio(), se p è 1?
    Allora, stima lanci e stima lanci multipli se hai provato il programma escono corretti, cioè randomici. Il problema si pone nella stima della probabilità.
    Per il fatto del ritorno 0, il ragionamento è questo: p é uguale ad 1, eseguo la funzione simula lancio, se esce uno la condizione dell'if è vera e quindi salvo il valore di testa, se no scarto ed incremento i, vado avanti e ripeto il procedimento per n monete.
    Appunto è proprio questo il problema: come fa la condizione if(p==simula_lancio()) ad essere vera, se simula_lancio() non ritorna mai 1? E poi nell'ultima funzione, tu inizializzi una variabile l, ma senza valore, e poi la usi come parametro nella funzone simula_lanci_multipli(l)

    Edit

    E comunque no, i primi due valori mi escono sempre 0, non randomici come dovrebbero essere
  • Re: [C] Probabilità lancio monete

    Questa funzione
    
    int simula_lancio (){ //simula il lancio di una singola moneta
       int c=0;
       if (rand () % 2 == 0) return c; //testa
       
    }
    
    restituisce sempre 0
  • Re: [C] Probabilità lancio monete

    ANDPRI ha scritto:


    Fabio96 ha scritto:


    ANDPRI ha scritto:


    Ok ho appena provato il programma e mi sto chiedendo: "ma come ho fatto a non accorgermene prima?" È un errore così evidente e ce l'avevo sotto il naso! Scusa, se tu da simula_lancio() ritorni solo 0 o niente (il che è comunque sbagliato) come pretendi che in simula_lanci_multipli() p sia uguale a simula_lancio(), se p è 1?
    Allora, stima lanci e stima lanci multipli se hai provato il programma escono corretti, cioè randomici. Il problema si pone nella stima della probabilità.
    Per il fatto del ritorno 0, il ragionamento è questo: p é uguale ad 1, eseguo la funzione simula lancio, se esce uno la condizione dell'if è vera e quindi salvo il valore di testa, se no scarto ed incremento i, vado avanti e ripeto il procedimento per n monete.
    Appunto è proprio questo il problema: come fa la condizione if(p==simula_lancio()) ad essere vera, se simula_lancio() non ritorna mai 1? E poi nell'ultima funzione, tu inizializzi una variabile l, ma senza valore, e poi la usi come parametro nella funzone simula_lanci_multipli(l)

    Edit

    E comunque no, i primi due valori mi escono sempre 0, non randomici come dovrebbero essere

    Ok ho sistemato il codice ora si presenta così:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int simula_lancio ();
    int simula_lanci_multipli(int monete);
    float stima_lanci (int teste);
    
    int main() {
    
    int n,k;
    
    srand(time(NULL));
    
    printf("Inserisci il numero delle monete da lanciare:");
    scanf("%i", &n);
    
    printf("Inserisci il numero delle teste che vuoi verificare:");
    scanf("%i", &k);
    
    printf("[Simula]\n");
    printf("%i\n", simula_lancio());
    
    printf("[Lancio N]\n");
    printf("%i\n", simula_lanci_multipli(n));
    
    
    
    printf("[STIMA]\n");
    printf("%f\n", stima_lanci(k));
    
    return 0;
    
    }
    
    
    int simula_lancio (){ //simula il lancio di una singola moneta
    	
    	 return rand () % 2; //testa
    	
    }
    
    int simula_lanci_multipli (int monete) { //simula un singolo lancio di n monete
    
    	int i=1,a=0;
    	
    	while(i<=monete) { simula_lancio ();
    		if (simula_lancio ()==0) a++; //se ottengo testa incremento la variabile
    		i++; }
    		
    	return a; //restituisce il valore di quante teste ho trovato in un singolo lancio
    }
    
    float stima_lanci (int teste) { //effettuo 1000 lanci e vedo quante volte coincidono
    
    	int r=10000;
    	int j;
    	float nlanci=0;
    	float prob=0;
    	int l;
    	
    	for(j=1;j<=r;j++) { 
    	
    		if(teste==simula_lanci_multipli(l)) nlanci++;} //se il valore è uguale a quello previsto salvo il numero
    
    	prob=nlanci/r;
    	
    	return prob;	
    }
    Non ho capito bene cosa dovrei mettere per inizializzare l in questo caso. Io vorrei che lui confrontasse il numero inserito dall'utente(k) con i risultati di testa ottenuti in un lancio per trovare quelli uguali.
  • Re: [C] Probabilità lancio monete

    Si ora va bene simula_lanci_multipli() ma nel while ci hai messo due simula_lancio() di cui il primo è inutile, fai il doppio dei lanci senza senso. E poi scusa ma ancora non ho capito cosa vuoi ottenere con stima_lanci(): se vuoi ottenere la probabilità di fare testa su 1000 lanci (questo è quello che ho capito, anche se hai scritto 10000 e non 1000) devi farlo diversamente, non serve nemmeno il parametro int teste. Se invece vuoi lanciare per 1000 volte n monete e vedere quante volte, lanciando quelle n monete, ottieni un numero x di teste, allora è diverso. Secondo me tu ora sei a metà tra le due cose ma non so qual è quella che devi fare
  • Re: [C] Probabilità lancio monete

    ANDPRI ha scritto:


    Si ora va bene simula_lanci_multipli() ma nel while ci hai messo due simula_lancio() di cui il primo è inutile, fai il doppio dei lanci senza senso. E poi scusa ma ancora non ho capito cosa vuoi ottenere con stima_lanci(): se vuoi ottenere la probabilità di fare testa su 1000 lanci (questo è quello che ho capito, anche se hai scritto 10000 e non 1000) devi farlo diversamente, non serve nemmeno il parametro int teste. Se invece vuoi lanciare per 1000 volte n monete e vedere quante volte, lanciando quelle n monete, ottieni un numero x di teste, allora è diverso. Secondo me tu ora sei a metà tra le due cose ma non so qual è quella che devi fare
    Si scusami hai ragione non me ne ero accorto, grazie.
    Esatto, dovrei fare la seconda delle cose che hai detto, ad esempio devo lanciare 50 monete e vedere in quanti lanci escono ad esempio 10 testa( che sarebbe il k messo dall'utente), il tutto su un totale di 1000 simulazioni.
  • Re: [C] Probabilità lancio monete

    Se 50 è un numero fisso allora penso che l dovrebbe essere 50 no? Quindi lanci 50000 monete in gruppi di 50. Cosi dovrebbe funzionare bene allora, però se ti serve solo il numero di lanci con k teste non devi dividerlo, oppure lo devi trasformare in percentuale
  • Re: [C] Probabilità lancio monete

    ANDPRI ha scritto:


    Se 50 è un numero fisso allora penso che l dovrebbe essere 50 no? Quindi lanci 50000 monete in gruppi di 50. Cosi dovrebbe funzionare bene allora, però se ti serve solo il numero di lanci con k teste non devi dividerlo, oppure lo devi trasformare in percentuale
    Nono 50 non è un numero fisso, sarebbe l'n che deve scrivete l'utente.
    La formula ce l'ha data il prof per aiutarci e sarebbe: Probabilità=Numero di lanci in cui sono uscite k teste (il mio nlanci)/r(10000)
  • Re: [C] Probabilità lancio monete

    E allora in questo caso devi usare due parametri in input nella funzione stima_lanci(), sarebbero n e k. A quel punto fai int l=n e l'utilizzo di k rimane lo stesso. Però secondo me devi ritornare nlanci*100/r, perché così è veramente una percentuale, altrimenti vengono numeri minuscoli
Devi accedere o registrarti per scrivere nel forum
13 risposte