PDA

View Full Version : programma C (no ++)


lucas86mj23
04-02-2004, 21:52
ciao raga!!
riekkomi con 1 dei miei prob col C.

dovrei fare 1 prog in cui bisogna inserire da tastiera quanti dadi (da 6 numeri)si vogliono tirare e il risultato ke si vuole ottenere.
il prog restituisce la percentuale di uscita del numero inserito

ho calcolato ke con x dadi c possono essere 6^x combinazioni.
ora devo trovare la formula ke mi dice la possibilità ke il num inserito

ad esempio con 1 dado
1--2--3--4--5--6
x ogni numero cè il 16.666% d uscita.

con 2 dadi ho 36 combinazioni
le ho stese su foglio ma nn riesco a trovare la formula!!

poi alla fine dovrei fare percent= percent riuscita / comb.totali (6^x)

m aiutate?!
grassie!

bizzu
04-02-2004, 22:07
Non ho capito bene cosa vuoi sapere...
Vuoi sapere la probabilità che tirando n dadi esca sempre lo stesso numero? Se è così basta fare 1/(6^n) dove n è il numero di dadi. Infatti la prob che esca un numero è 1/6, se consideri n dadi devi moltiplicare le probabilità perché gli eventi sono correlati. Quindi 1/6*1/6*...*1/6 = 1/(6^n)
Se vuoi implementarlo in C non è difficile, basta crearsi la funzione di elevamento a potenza (che se non ricordo male nell'ANSI non c'è)...

lucas86mj23
04-02-2004, 22:20
no..praticamente inserisco il numero ad esempio
1

inserisco il num dadi
1

quindi con 1 dado da 6 quante possibilità ho ke esca 1 ?

le possibilità su 6^1 ke esca 1 sono 1 / 6 = 0.1666 = 16.666%

il numero sopra la frazione (numer o denomin? boh...:D)
sono i casi possibili ke combinando i dadi esca il numero inserito.

con 2 dadi le combinazioni sono 36:
1-1__1-2__1-3__1-4__1-5__1-6__2-1__2-2__2-4__2-3__2-5__2-6__3-1__3-2__3-3__3-4__3-5__3-6__
__4-1__4-2__4-3__4-4__4-5__4-6__5-1__5-2__5-3__5-4__5-5__5-6__6-1__6-2__6-3__6-4__6-5__6-6

ora...quante possibilità ho ke esca ad es....il num 3?
1-2 & 2-1 cioè 2 casi

ora devo fare 2 / 6^2 cioè 1/18 = 0.0555555
cioè 5.555%

capito ora?

AnonimoVeneziano
04-02-2004, 22:25
Originariamente inviato da lucas86mj23
?

le possibilità su 6^1 ke esca 1 sono 1 / 6 = 0.1666



Questo lo devi moltiplicare per 100 dopo per trovare la percentuale

Ciao

lucas86mj23
04-02-2004, 23:01
ok ma devo fare 1 funzione (opss...non l'avevo scritto)
kon la formula ke vale x ogni numero e ogni quantità di dadi

lucas86mj23
06-02-2004, 15:07
uppete!!
aiuto!

alderighi
07-02-2004, 17:41
la formula non è semplice ma neanche difficile ora ci studio e te la mando

cionci
07-02-2004, 18:17
La formula dovrebbe essere: tutte le possibili combinazioni per ottenere la somma richiesta con n dad...moltiplicato per (1/6)^n...
Il problema magari è trovare tutte le possibile combinazioni di n dadi per ottenere la somma richiesta...per ora non mi viene in mente niente...
Qui ci vorrebbe a2000...

alderighi
07-02-2004, 18:27
ci vorrebbe il mio prof di calcolo...
comunque sembrerebbe funzionare combinazioni di
(numerodadi-1 su numerochedeveuscire-1).
Però non devi fare dei controlli perchè non funziona quando il numero che deve uscire è 1 e inoltre è un casino perchè non tiene di conto del numero massimo dei dadi.
La cosa deve essere semplice ma mi sfugge.
Prova a vedere su un lib di calcolo.

Joestar
07-02-2004, 18:38
Ciao, vedi un po' se è questo qullo che cercavi e se il breve prog che ho scritto fa effettivamente quello che hai chiesto tu.

#include <stdio.h>

#define FACCE 6

int power(int a);

int main (void)

{
int nfreq,ndadi,ctrlm,ctrlM;
double perc;

for ( ; ; ) {

printf("Quanti dadi da %d vuoi utilizzare: ? (ctrl+c per uscire)",FACCE);
scanf("%d",&ndadi);

printf("\n\nDi che numero, dato dalla somma di %d dadi a %d facce vuoi conoscere la probabilita' che si ottenga con un lancio: ?",ndadi,FACCE);
scanf("%d",&nfreq);

ctrlm=1*ndadi;
ctrlM=FACCE*ndadi;

if (nfreq<ctrlm || nfreq>ctrlM) {
printf("\n\nIl numero inserito non e'una somma ottenibile con il numero di dadi inserito. \n\n\n");
}

else {
perc=ndadi/(double)power(ndadi);;
printf("\nLa percentuale e' %.3f %%\n\n",perc*100);
}

}

return 0;
}


int power(int a)

{
int power,cnt=1;

if (a==1) {
power=FACCE;
return power;
}

else {
for (cnt; cnt < a; cnt++)
power=FACCE*FACCE;
return power;
}

}

Fammi sapere se è corretto e se ti è stato utile.
Non ha mantenuto l'indentazione dopo il copia e incolla, sigh.

Joestar
07-02-2004, 18:47
Ops non è corretto manca qualcosa, lo sto correggendo.

Joestar
07-02-2004, 18:56
Azz devo staarci dietro un po' , ora ho gente in casa, ma + tardi ci lavoro su.

lucas86mj23
07-02-2004, 19:05
grazie 1000 x l' aiuto ke mi stai dando!!!

Joestar
09-02-2004, 00:12
Ciao a tutti.
In parte ho risolto qualcosa, ma manca ancora un algoritmo che soddisfi qualsiasi caso.

Partiamo da un po' + indietro.

In generale per sapere quante combinazioni totali sono possibili con N dadi, la formula è: (nfacciedado)^ndado/i.
Es. 4 dadi da 6 facce avranno 1296 combinazioni possibili.

Per conoscere il "range" delle "somme possibili" tra n dadi:
numerodado/i *nfacce - (numerodado/i -1)
Es. 4 dadi da 6 facce avranno 21 somme possibili. (che vanno da 4 a 24, dove 4 e 24 sono rispettivamente il + piccolo e il + grande numero ottenibile con 4 dadi).

La formula che funziona per tutti i casi l'ho trovata, mi manca solo la maniera precisa di determinare un coefficente e cioè il numero di volte che si ripete + spesso un certo numero. (fra poco farò uno schemino e tuttò sarà + chiaro).

Prima la formula poi vi spiego il problema.
Questa formula calcola la percentuale con cui il numero + piccolo e il numero + grande ottenibile con n dadi di n facce si presenti.

percentuale = (ndadi / (nfacce ^ ndadi) ) / ndadi ) * 100

Ora, data questa formula ho notato che la frequenza con cui si ripetono le varie somme possibili ha un legame, che fino ad un certo punto è matematico, ma da un certo punto in poi, non lo capisco + (spero che qualcuno riesca a completare la cosa).

(Abbrevio dado con d, il numero che precede la d è la quantità di dadi, quello che la segue è il numero di facce)

Guardate questa tabella che considera i lanci di 1d4, 2d4 e 3d4.

Som 1 2 3 4 5 6 7 8 9 10 11 12
1d4 1 1 1 1
2d4 1 2 3 4 3 2 1
3d3 1 3 6 10 12 12 10 6 3 1

Spero sia abbastanza chiara, ora cmq provo a spiegare come funziona.
La riga somme indica le somme o i risultati che dir si voglia ottenuti dal lancio di n dadi a n facce.
I numeri sotto si riferiscono a quante volte si ripete la somma possibile che fa ottenere il numero che si cerca. La somma totale di ogni riga corrisponde al numero di combinazioni totali, infatti per 1d4 sono 4, per 2d4 sono 4^2 (e 1 + 2 +3 +4 +3 +2 +1 fa appunto 16) per 3d3 sono 4^3=64 etc, etc.
Ora il mio problema è che ho trovato una relazioni in quella tabella rettangolo che mi permette di determinare alcuni numeri, ma non tutti ! I + attenti avranno gia notato che esistono delle relazioni di somma tra le righe.
Es. il 4 sotto il 5 è la somma di 3 + l'1 che gli sta sopra. Il 10 è la somma del 6 che lo precede e del 4 che gli sta sopra. In generale per una serie di numeri posso determinare con precisione in questa maniera quante volte si ripeterà tal numero.
Ma c'è un problema. Nel caso della riga di 3d3 per esempio, riesco a determinare senza problemi e con rigore matematico 1 3 6 10 (e quindi di conseguenza anche l'altra parte speculare 10 6 3 1) Ma i 2 "12" come li ottengo da quella tabella ? Ebbene, non ci sono ancora riuscito, non ho trovato una relazione. (In realtà per i 2 "12" si, ma credo sia un caso. Sapendo che per 3d3 le comb totali sono 64 e sottraendo a 64 (1+3+6+10)*2 ottendo 24 che diviso 2 da 12.
Ma per 4d4 i numeri che non riesco a determinare con quella tabella crescono di 1 rispetto a 3d3 e così via per tutti i successivi.

Come li ho determinati allora ? e Come so che 12 è corretto ?
Ho modificato un programma che simula il lancio di n dadi e calcola la frequenza con cui le possibili somme si ripetono.
(Lo copio ed incollo nel prox messaggio).

Sono sicuro che ci sia un modo per determinare matematicamente da quella tabella tutti i numeri corretti, se qualcuno trova o sa come, si faccia avanti perfavore.

EDIT

Porca miseria non tiene le spaziature della tabella, spero abbiate capito come funziona !
È come un triangolo la cui ipotenusa è formata da 1 1 1 in diagonale.

lucas86mj23
12-02-2004, 18:32
grazie kmq!
ora mi aiuteresti kn 1 altro?

devo aprire un img bitmap 400x300 @ 16colori e visualizzarla @ skermo!!
grassssssie!!!
;)

lucas86mj23
15-02-2004, 22:38
uppino !
è x domani!