[ C ++] Compilazione di un semplice programma matematico
Ciao a tutti!
Ho appena iniziato a studiare qualcosa del linguaggio C++ in quanto devo realizzare un piccolo programma per la risoluzione di problemi matematici da portare all'appello orale di un esame. Siccome la parte di programmazione è ridotta all'osso (non costituisce, infatti, la parte centrale dell'esame) e siccome il prof. ha richiesto una conoscenza davvero minima del linguaggio, vorrei realizzare un programma non troppo complicato ma, comunque, non banale. Che tipo di programma potrei realizzare secondo voi? Avete qualche idea? Inoltre, sarebbe davvero gradita una mano nella compilazione del programma e nella correzione degli errori...
Grazie a tutti
Ho appena iniziato a studiare qualcosa del linguaggio C++ in quanto devo realizzare un piccolo programma per la risoluzione di problemi matematici da portare all'appello orale di un esame. Siccome la parte di programmazione è ridotta all'osso (non costituisce, infatti, la parte centrale dell'esame) e siccome il prof. ha richiesto una conoscenza davvero minima del linguaggio, vorrei realizzare un programma non troppo complicato ma, comunque, non banale. Che tipo di programma potrei realizzare secondo voi? Avete qualche idea? Inoltre, sarebbe davvero gradita una mano nella compilazione del programma e nella correzione degli errori...
Grazie a tutti

Risposte
Consigli?
"daniele91":
Ho trovato l'errore nel codice e ora sembra che i risultati forniti dal programma siano corretti. A parte questo, in risposta al post di Vict85, mi chiedevo se ha senso inserire il test finale verificando che $\chi^2 > 11,070$.
Infatti, se il $\chi^2$ è minore di quel valore critico dimostro che i risultati sono frutto di fluttuazioni statistiche. Se invece il valore è maggiore, allora il valore del $\chi^2$ è più verosimilmente frutto di altre cause non dovute alle fluttuazioni. Siccome il programma realizzato è una simulazione di dadi non truccati in quanto le frequenze risultanti sono del tutto casuali, qual'è il senso della verifica finale? Cosa dimostro se il $\chi^2$ è maggiore o minore del valore critico?
Dimostri se la funzione rand() è davvero casuale o meno.
Ma il random non è appunto, per definizione, una funzione pseudo-casuale? Devo inserire un ciclo if per vedere se la condizione $\chi^2 > 0 $ è soddisfatta o meno?
Inoltre, sulla mia dispensa c'è scritto che " L'ipotesi si rivela ragionevole se $ \chi^2 $ vale circa $ (\nu\pm sqrt(2\nu)) $ dove $\nu$ rappresentano i gradi di libertà".
In questo caso ottengo che $ 1,83 < \chi^2 < 8,16 $. Devo procedere in questo modo?
Inoltre, sulla mia dispensa c'è scritto che " L'ipotesi si rivela ragionevole se $ \chi^2 $ vale circa $ (\nu\pm sqrt(2\nu)) $ dove $\nu$ rappresentano i gradi di libertà".
In questo caso ottengo che $ 1,83 < \chi^2 < 8,16 $. Devo procedere in questo modo?
Guarda per esempio qui:
http://users.dimi.uniud.it/~lorenzo.fre ... 6_test.pdf
Personalmente comunque non vedo perché non possa essere 0... Immagino che le tue dispense analizzino applicazioni particolari in cui aspettarsi la completa fedeltà tra evento ed ipotesi sia improbabile.
http://users.dimi.uniud.it/~lorenzo.fre ... 6_test.pdf
Personalmente comunque non vedo perché non possa essere 0... Immagino che le tue dispense analizzino applicazioni particolari in cui aspettarsi la completa fedeltà tra evento ed ipotesi sia improbabile.
Scusa, ho sbagliato a scrivere. Volevo dire: devo inserire la condizione $\chi^2 >11,070 $ che è il valore critico al 5% di significatività?
Ragazzi potete aiutarmi per favore? Ho disperato bisogno del vostro aiuto

Prima cosa: non ti incaponire sulla funzione di generazione di numeri pseudocasuali rand(), puoi anche vederla come diceva vict85 prima.
Seconda cosa: io non ho capito esattamente quale sia la difficoltà, il calcolo in sé o la condizione da aggiungere o che altro?
Seconda cosa: io non ho capito esattamente quale sia la difficoltà, il calcolo in sé o la condizione da aggiungere o che altro?
La mia difficoltà è rappresentata proprio dalla condizione perché non riesco a capire se abbia senso inserire un test del chi quadro se la funzione random assicura la casualità della distribuzione delle facce del dado.
In realtà, considerando che l'algoritmo spesso implementato per la funzione rand è il Linear congruential generator, esistono spesso dei test in grado di distinguere l'output di questo generatore da una sequenza realmente casuale. Ovviamente se l'algoritmo usato è diverso, è possibile che non siano stati ancora trovati test in grado di distinguere il suo output da una sequenza totalmente casuale. La funzione rand non da in effetti alcuna garanzia sulla bontà del generatore di numeri casuali usato.
Inoltre, il generatore di numeri casuali genera valori in un qualche intervallo [0, RAND_MAX-1] e, anche supponendo che questi valori siano effettivamente generati in modo uniforme, non è detto che lo siano anche i numeri in rand()%k per un qualche k. Supponiamo per esempio che RAND_MAX fosse uguale a 32 (è molto più grande ma mi semplifica i conti supporlo così piccolo) e k uguale a 13. Generando i numeri da 0 a 31 in modo uniforme e calcolando quindi il modulo per 13 si ottiene la seguente distribuzione:
P(0) = 3/32, P(1) = 3/32, P(2) = 3/32, P(3) = 3/32, P(4) = 3/32, P(5) = 3/32,
P(6) = 1/16, P(7) = 1/16, P(8) = 1/16, P(9) = 1/16, P(10) = 1/16, P(11) = 1/16, P(12) = 1/16
Come vedi la distribuzione non è uniforme.
Inoltre, il generatore di numeri casuali genera valori in un qualche intervallo [0, RAND_MAX-1] e, anche supponendo che questi valori siano effettivamente generati in modo uniforme, non è detto che lo siano anche i numeri in rand()%k per un qualche k. Supponiamo per esempio che RAND_MAX fosse uguale a 32 (è molto più grande ma mi semplifica i conti supporlo così piccolo) e k uguale a 13. Generando i numeri da 0 a 31 in modo uniforme e calcolando quindi il modulo per 13 si ottiene la seguente distribuzione:
P(0) = 3/32, P(1) = 3/32, P(2) = 3/32, P(3) = 3/32, P(4) = 3/32, P(5) = 3/32,
P(6) = 1/16, P(7) = 1/16, P(8) = 1/16, P(9) = 1/16, P(10) = 1/16, P(11) = 1/16, P(12) = 1/16
Come vedi la distribuzione non è uniforme.
Quindi, mi pare di aver capito che il test del chi quadro non permette di distinguere se la generazione di numeri mediante la funzione random () sia davvero una sequenza casuale o meno. Tutti i valori del chi prodotti dal mio programma risultano essere inferiori rispetto al valore critico e ciò dovrebbe significare che le sequenze prodotte siano più o meno simili alle sequenze casuali a seconda della grandezza del chi (considerando che questo rappresenti la dispersione dei dati rispetto al valor medio). Visto però che, come ha detto tu, la generazione di numeri da parte della funzione random non è davvero uniforme, come faccio a dimostrarlo? Cadevo in errore pensando che la funzione random desse luogo ad una distribuzione uniforme (perché così mi era stata spiegata).
Comunque grazie per l'aiuto!
Comunque grazie per l'aiuto!
Ragazzi qualcun'altro può aiutarmi per favore? Grazie!