|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Napoli
Messaggi: 786
|
[C] Esercizio che non riesco a risolvere
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: Codice:
#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++;
}
}
Mi sapreste dire dov'è l'errore? tnx.
__________________
Q9650@4140Mhz Voltaggi Feedback positivi ottenuti per vendite fatte a: Alfio89, Deskmat, Renato10, il mic, sosa, Emack - [ Lastre di Alluminio per modding computer ]
Ultima modifica di Riccardo88 : 23-08-2009 alle 16:24. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Ad occhio il problema è nell'inizializzazione del seme della funzione random...
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 1059
|
l'errore è nell'uso della funzione rand()
per generare un numero nell'intervallo 0, (N-1) devi usare una cosa del tipo Codice:
(int)((double)rand() / ((double)RAND_MAX + 1) * N) |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Napoli
Messaggi: 786
|
Ciao,scusa la niubbaggine ma sono praticamente agli inizi,in pratica dovrei utilizzare la stringa che mi hai postato al posto di rand()?
__________________
Q9650@4140Mhz Voltaggi Feedback positivi ottenuti per vendite fatte a: Alfio89, Deskmat, Renato10, il mic, sosa, Emack - [ Lastre di Alluminio per modding computer ]
Ultima modifica di Riccardo88 : 23-08-2009 alle 14:48. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
x % 1 = 0 per ogni x.
per generare casualmente cifre binarie equiprobabili puoi usare Codice:
result = rand()%2; ti consiglio di usare il tag [code] per mantenere l'indentazione e migliorare così la leggibilità del codice che posti. Ultima modifica di Furla : 23-08-2009 alle 16:22. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Napoli
Messaggi: 786
|
Anche così ho ancora o tutte "testa" o tutte "croce".
Codice:
#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++;
}
}
__________________
Q9650@4140Mhz Voltaggi Feedback positivi ottenuti per vendite fatte a: Alfio89, Deskmat, Renato10, il mic, sosa, Emack - [ Lastre di Alluminio per modding computer ]
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Napoli
Messaggi: 786
|
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ì: Codice:
#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++;
}
}
__________________
Q9650@4140Mhz Voltaggi Feedback positivi ottenuti per vendite fatte a: Alfio89, Deskmat, Renato10, il mic, sosa, Emack - [ Lastre di Alluminio per modding computer ]
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Non c'è alcuna differenza tra gli ultimi due programmi (funzionano entrambi correttamente).
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Napoli
Messaggi: 786
|
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()?
__________________
Q9650@4140Mhz Voltaggi Feedback positivi ottenuti per vendite fatte a: Alfio89, Deskmat, Renato10, il mic, sosa, Emack - [ Lastre di Alluminio per modding computer ]
Ultima modifica di Riccardo88 : 23-08-2009 alle 20:17. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
if (result == 1 ){ mentre nel secondo if (result == 2 ){ Devi aver sbagliato qualcosa, perché ho provato entrambi i programmi e funzionano senza differenze. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jun 2006
Città: Napoli
Messaggi: 786
|
Ok sto controllando proprio ora...allora:
con questa espressione: Codice:
result = 1 + ( rand() % 2 ); viceversa con la seconda espressione: Codice:
result = rand()%2; Codice:
int flip( void )
{
if (result == 1 ){
printf("Tails\n");
return tails++;
}
else{
printf("Heads\n");
return heads++;
}
}
Codice:
int flip( void )
{
if (result == 2 ){
printf("Tails\n");
return tails++;
}
else{
printf("Heads\n");
return heads++;
}
}
quindi in definitiva usare questa espressione Codice:
result = 1 + ( rand() % 2 ); Se non ti trovi fammi sapere.
__________________
Q9650@4140Mhz Voltaggi Feedback positivi ottenuti per vendite fatte a: Alfio89, Deskmat, Renato10, il mic, sosa, Emack - [ Lastre di Alluminio per modding computer ]
Ultima modifica di Riccardo88 : 24-08-2009 alle 10:03. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
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. Ultima modifica di ||ElChE||88 : 24-08-2009 alle 10:11. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
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.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jun 2006
Città: Napoli
Messaggi: 786
|
Quote:
Codice:
result = rand()%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 è Codice:
result = 1 + ( rand() % 2 ); Quindi in base all'espressione si deve adattare l'intervallo, cosa ovvia ora che ho notato l'errore. grazie.
__________________
Q9650@4140Mhz Voltaggi Feedback positivi ottenuti per vendite fatte a: Alfio89, Deskmat, Renato10, il mic, sosa, Emack - [ Lastre di Alluminio per modding computer ]
Ultima modifica di Riccardo88 : 24-08-2009 alle 10:40. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:23.










Feedback positivi ottenuti per vendite fatte a: Alfio89, Deskmat, Renato10, il mic, sosa, Emack 











