View Full Version : [C] Esercizio che non riesco a risolvere
Riccardo88
23-08-2009, 12:15
Ciao,durante quest'estate ho iniziato ad imparare il C.
ora ho appena finito di studiare le funzioni e ho questo esercizio che non riesco a risolvere, in pratica devo scrivere un programma che lanci una monetina 100 volte e contare quante volte esce testa e quante volte esce croce,per farlo devo utlizzare una funzione che non riceve argomenti chiamata "flip" ,ho provato qualcosa del genere:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int flip( void );
int heads = 0;
int tails = 0;
int result;
int main()
{
int count;
for(count = 1; count <= 100; count++){
srand( time( NULL ) );
result = 0 + ( rand() % 1 );
flip();
}
printf("\nRisultato:\tHeads\t\tTails\n\n");
printf("\t\t%d\t\t%d", heads, tails);
getchar();
getchar();
return 0;
}
int flip( void )
{
if (result == 0 ){
printf("Tails\n");
return tails++;
}
else{
printf("Heads\n");
return heads++;
}
}
però mi assegna tutti i 100 risultati o a testa o a croce ma non mi divide i casi volta per volta.
Mi sapreste dire dov'è l'errore?
tnx.
Ad occhio il problema è nell'inizializzazione del seme della funzione random...
Energy++
23-08-2009, 12:38
l'errore è nell'uso della funzione rand()
per generare un numero nell'intervallo 0, (N-1) devi usare una cosa del tipo
(int)((double)rand() / ((double)RAND_MAX + 1) * N)
Riccardo88
23-08-2009, 14:35
Ciao,scusa la niubbaggine ma sono praticamente agli inizi,in pratica dovrei utilizzare la stringa che mi hai postato al posto di rand()?
http://img146.imageshack.us/img146/6764/testacroce.th.jpg (http://img146.imageshack.us/i/testacroce.jpg/)
x % 1 = 0 per ogni x.
per generare casualmente cifre binarie equiprobabili puoi usare
result = rand()%2;
inoltre la srand viene chiamata in continuazione con lo stesso seme (perché tutte le chiamate avvengono in un lasso di tempo brevissimo), ti conviene metterla prima del for.
ti consiglio di usare il tag [CODE] per mantenere l'indentazione e migliorare così la leggibilità del codice che posti.
Riccardo88
23-08-2009, 16:28
Anche così ho ancora o tutte "testa" o tutte "croce".
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int flip( void );
int heads = 0;
int tails = 0;
int result;
int main()
{
int count;
srand( time( NULL ) );
for(count = 1; count <= 100; count++){
result = rand()%2;
flip();
}
printf("\nRisultato:\tTesta\t\tCroce\n\n");
printf("\t\t%d\t\t%d", heads, tails);
getchar();
getchar();
return 0;
}
int flip( void )
{
if (result == 1 ){
printf("Tails\n");
return tails++;
}
else{
printf("Heads\n");
return heads++;
}
}
Riccardo88
23-08-2009, 19:11
EUREKA!!!!!!!!!!!!
Ce l'ho fatta!
in pratica,come avete detto e come avevo pensato, il seme andava messo fuori il ciclo altrimenti prendeva sempre lo stesso valore e lo associava 100 volte senza aggiornarlo,ma l'espressione per randomizzare era sempre questa: result = 1 + ( rand() % 2 );.
quindi funziona così:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int flip( void );
int heads = 0;
int tails = 0;
int result;
int main()
{
int count;
srand( time( NULL ) );
for(count = 1; count <= 100; count++){
result = 1 + ( rand() % 2 );
flip();
}
printf("\nRisultato:\tTesta\t\tCroce\n\n");
printf("\t\t%d\t\t%d", heads, tails);
getchar();
getchar();
return 0;
}
int flip( void )
{
if (result == 2 ){
printf("Tails\n");
return tails++;
}
else{
printf("Heads\n");
return heads++;
}
}
Grazie a tutti! :D
||ElChE||88
23-08-2009, 19:18
Non c'è alcuna differenza tra gli ultimi due programmi (funzionano entrambi correttamente).
Riccardo88
23-08-2009, 20:12
ciao ti riferisci al cambio di espressione
1) result = rand()%2;
2)result = 1 + ( rand() % 2 );
perchè nel primo caso mi affidava comunque tutti i 100 tiri a solo una delle due opzioni,mentre con il secondo caso calcola efficacemente volta per volta.
Oppure ti riferisci alla posizione di srand()?
||ElChE||88
23-08-2009, 20:27
ciao ti riferisci al cambio di espressione
1) result = rand()%2;
2)result = 1 + ( rand() % 2 );
Si. Il cambio d'espressione non fa alcuna differenza, visto che nel primo caso c'è
if (result == 1 ){
mentre nel secondo
if (result == 2 ){
perchè nel primo caso mi affidava comunque tutti i 100 tiri a solo una delle due opzioni,mentre con il secondo caso calcola efficacemente volta per volta.
Devi aver sbagliato qualcosa, perché ho provato entrambi i programmi e funzionano senza differenze.
Riccardo88
24-08-2009, 10:00
Ok sto controllando proprio ora...allora:
con questa espressione: result = 1 + ( rand() % 2 );
sia che il primo if valga 1 o valga 2 ovviamente non cambia niente.
viceversa con la seconda espressione: result = rand()%2;
ottengo per
int flip( void )
{
if (result == 1 ){
printf("Tails\n");
return tails++;
}
else{
printf("Heads\n");
return heads++;
}
}
una equiprobabilità calcolata in maniera corretta e invece per:
int flip( void )
{
if (result == 2 ){
printf("Tails\n");
return tails++;
}
else{
printf("Heads\n");
return heads++;
}
}
l'errore sopra riportato.
quindi in definitiva usare questa espressione result = 1 + ( rand() % 2 ); che pone i due limiti è conveniente perchè posso affidare a Tails entrambi i valori avendo la certezza che funzioni comunque.
Se non ti trovi fammi sapere. :)
||ElChE||88
24-08-2009, 10:02
cut
Quel che hai detto è corretto, e conferma quel che ho detto: i due progammi sopra sono equivalenti.
La differenza è che nel primo caso avrai come risultati 0 o 1 (e quindi dovresti usare 0 o 1 come valori nell'if, non 2), nel secondo 1 o 2.
Quel che hai detto è corretto, e conferma quel che ho detto: i due progammi sopra sono equivalenti.
Esatto, non cambia nulla tra i due...
L'unico problema era l'inizializzazione del seme, veniva eseguita 100 volte utilizzando lo stesso valore [tranne rarissimi casi], quindi il primo valore pseudorandom estratto era sempre uguale.
Riccardo88
24-08-2009, 10:35
Quel che hai detto è corretto, e conferma quel che ho detto: i due progammi sopra sono equivalenti.
La differenza è che nel primo caso avrai come risultati 0 o 1 (e quindi dovresti usare 0 o 1 come valori nell'if, non 2), nel secondo 1 o 2.
Sì ora mi trovo perfettamente con te,la funzione result = rand()%2; nel secondo caso non funzionava perchè usava l'intervallo (1.2)
e dava errore ma andava adattata appunto all'intervallo (0.1) dell'if.
nella seconda espressione, invece funziona perchè l'intervallo è proprio (1.2) quindi funziona sempre in questo intervallo ma accade lo stesso errore nel caso in cui l'intervallo si sposta a (0.1) in questo caso è result = 1 + ( rand() % 2 ); a finire "fuori".
Quindi in base all'espressione si deve adattare l'intervallo, cosa ovvia ora che ho notato l'errore. :p
grazie. :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.