Newsgroup: it.comp.lang.pascal
Titolo: I 3 dadi...

Eccovi un programmino per vedere le percentuali di uscita di ogni numero
che puo uscire tirando 3 dadi da 6.
Il programma e lunghino, volevo sapere se c e un modo per  accorciarlo
(lo so gia ma senca il CASE _ OF) usando il CASE _ OF e possibilmente
senza usare altri comandi di quelli che io conosco, cioč quelli usati
nel prog.
Fatemi sapere, grazie



PAZZOOOOO!!!!!
 :-)))
program   tre_dati;
var       v:array[1..18] of word;
          i,n,s:word;
begin
          writeln;
          write(' Numero lanci : '); readln(n);
          randomize;
          for i:=1 to 18 do
              v[i]:=0;
          for i:=1 to n do begin
              s:=random(6)+random(6)+random(6)+3;
              inc(v[s])
          end;
          writeln;
          for i:=1 to 18 do
              writeln(i:2,' - ',((v[i]*100) div n),'%')
end.
By Fabio
--
fabi...@rocketmail.com

nel prog.
Dovresti usare un "array".
Dichiara qualcosa del genere 
var sum : array [1..20] of integer ;
ed accedi agli elementi con sum[1] sum[2] ecc...
Andrea Laforgia


Ma quale comandi???
Vuoi programmare senza conoscere ne le FOR e ne i VETTORI??
--
fabi...@rocketmail.com

Un bel di' Darkluca scrisse:
D> This is a multi-part message in MIME format.
D> --------------87D4E9BC413BD54AE3B57E40
D> Content-Type: text/plain; charset=iso-8859-1
D> Content-Transfer-Encoding: 8bit
D> 
Ti prego di non postare in html... allunghi i msg e ne rendi
piu' difficile la lettura!
D> Il programma e lunghino, volevo sapere se c e un modo per  accorciarlo
D> (lo so gia ma senca il CASE _ OF) usando il CASE _ OF e possibilmente
D> senza usare altri comandi di quelli che io conosco, cioč quelli usati
D> nel prog.
D> 
vediamo :-)
D> USES CRT;
D> var numlanci,lancio,a,sum3,sum4,sum5,sum6,sum7,sum8,sum9,sum10,sum11,sum12,sum13,sum14,sum15,sum16,sum17,sum18:integer;
D> 
allora, prima cosa: le variabili...
invece di chiamare sum3, sum4, sum5... costruiamo un vettore:
var numlanci, lancio, a: integer;
    sum: array [3..18] of integer;
D> BEGIN
D>   clrscr;
D>   write('digita il numero di lanci che vuoi eseguire e batti invio ');
D>   readln(numlanci);
perfetto!
D>   a:=0;
D>   sum3:=0;
D>   sum4:=0;
D>   sum5:=0;
D>   sum6:=0;
D>   sum7:=0;
D>   sum8:=0;
D>   sum9:=0;
D>   sum10:=0;
D>   sum11:=0;
D>   sum12:=0;
D>   sum13:=0;
D>   sum14:=0;
D>   sum15:=0;
D>   sum16:=0;
D>   sum17:=0;
D>   sum18:=0;
a lo usi per i cicli... di solito si utilizza "i" :-)
Comunque sia, e' inutile inizializzarla.
I vari sum, visto che abbiamo usato un array, li comprimiamo:
for a:=3 to 18 do
	sum[a] := 0;
D>   randomize;
ok. Io lo metterei all'inizio del programma, ma non cambia nulla.
D>   FOR a:=1 TO numlanci DO
D>   BEGIN
D>     lancio:=random(6)+random(6)+random(6)+3;
D>     CASE lancio OF
D>     3  : sum3:=sum3+1;
D>     4  : sum4:=sum4+1;
D>     5  : sum5:=sum5+1;
D>     6  : sum6:=sum6+1;
D>     7  : sum7:=sum7+1;
D>     8  : sum8:=sum8+1;
D>     9  : sum9:=sum9+1;
D>     10 : sum10:=sum10+1;
D>     11 : sum11:=sum11+1;
D>     12 : sum12:=sum12+1;
D>     13 : sum13:=sum13+1;
D>     14 : sum14:=sum14+1;
D>     15 : sum15:=sum15+1;
D>     16 : sum16:=sum16+1;
D>     17 : sum17:=sum17+1;
D>     18 : sum18:=sum18+1
D>     END;
papam: voila' il tutto sfruttando l'array:
for a:=1 to numlanci do
	begin
	 lancio := random(6) + random(6) + random(6) + 3;
	 sum[lancio] := sum[lancio] + 1 ;
	end;
D>   END;
D>   writeln(sum3/numlanci*100:5:2);
D>   writeln(sum4/numlanci*100:5:2);
D>   writeln(sum5/numlanci*100:5:2);
D>   writeln(sum6/numlanci*100:5:2);
D>   writeln(sum7/numlanci*100:5:2);
D>   writeln(sum8/numlanci*100:5:2);
D>   writeln(sum9/numlanci*100:5:2);
D>   writeln(sum10/numlanci*100:5:2);
D>   writeln(sum11/numlanci*100:5:2);
D>   writeln(sum12/numlanci*100:5:2);
D>   writeln(sum13/numlanci*100:5:2);
D>   writeln(sum14/numlanci*100:5:2);
D>   writeln(sum15/numlanci*100:5:2);
D>   writeln(sum16/numlanci*100:5:2);
D>   writeln(sum17/numlanci*100:5:2);
D>   writeln(sum18/numlanci*100:5:2);
D>   writeln(sum18/numlanci*100:5:2);
anche qui:
for a:=3 to 18 do
	witeln(sum[a]/numlanci*100:5:2);
D>   REPEAT UNTIL keypressed;
va bene.
Morale: il programma diventa questo:
var numlanci, lancio, a: integer;
    sum: array [3..18] of integer;
begin
 for a:=3 to 18 do
        sum[a] := 0;
 for a:=1 to numlanci do
        begin
         lancio := random(6) + random(6) + random(6) + 3;
         sum[lancio] := sum[lancio] + 1 ;
        end;
 for a:=3 to 18 do
        witeln(sum[a]/numlanci*100:5:2);
 repeat until keypressed;
end.
Una versione piu' pulita, la farei cosi':
var numlanci, lancio, i: integer;
    sum: array [0..15] of integer;
begin
 for i:=0 to 15 do
        sum[i] := 0;
 for i:=1 to numlanci do
        begin
         lancio := random(6) + random(6) + random(6);
         inc (sum[lancio]);
        end;
 for i:=0 to 15 do
        witeln(i+3, ': ', (sum[i] / numlanci * 100):5:2);
 readkey;
end.
Ciao ciao!
-- 
Emanuele Cesena		
http://www.geocities.com/SiliconValley/Grid/8879
ami...@iol.it
 :)			 Occhio all'antispammer NOSPAZ!!
Scaricate ora Bubble 2000, ver. beta 1 :-)
http://gpi.eden.it/italianware/games/b2000b1.exe
 (900kb, ma il server e' buono!)
"La distanza del binario di partenza e' inversamente proporzionale al tempo
a disposizione per prendere il treno", prima legge di Kauffman sulle stazioni

By Fabio
?????
Non puoi usare RANDOM per calcolare la probabilità di uscita di un numero
con tre dadi!!!!!!!!!!!!
Così facendo ottieni dei dati sui quali fare una statistica ma non hanno
niente a che vedere con la probabilità teorica dei [3..18] numeri.
dovresti invece fare qualcosa del genere:
var
num:array [3..18] of word;
i,l,n:1..6;
begin
for i:=3 to 18 do num[i]:=0;
for i:=1 to 6 do
for l:=1 to 6 do
for n:=1 to 6 do
     num[i+l+n]:=num[i+l+n]+1;
(*ora puoi calcolare le percentuali dei numeri in base alla loro frequenze
contenute in num[i] *)
end;
Ciao ciao
Ulisse


Si puo' si puo'.
E' una statistica per tentativi e con un elevato numero
di tentativi (N) il risultato tende alla probabilita' teorica'
che dai tu.
Fabio
--
fabi...@rocketmail.com

U>
ù>
F>Si puo' si puo'.
F>E' una statistica per tentativi e con un elevato numero
F>di tentativi (N) il risultato tende alla probabilita' teorica'
F>che dai tu.
...non mi sembra una buona motivazione...
Perché vuoi studiare dati statistici per ottenere un risultato che 'tende' a
quello teorico quando puoi calcolartelo direttamente con un algoritmo
addirittura più facile???????
...mi sembra alquanto insensato.
NON SI PUO' utilizzare una funzione random. Il valore che calcoli tu, nel
migliore dei casi, si avvicina abbastanza alla P teorica ma non è MAI quello
giusto.
Non puoi usarlo per un modello matematico perché sarebbe affetto dall'errore
che commetti nella statistica.
Puoi avere la P teorica e preferisci una approssimazione che contiene un
errore???
Ciao
Ulisse

Ulisse
Ciao
Fabio
--
fabi...@rocketmail.com

U>giusto.
F>
F>Come MAI?
F>Con N grande (tendente ad infinito) DEVE tendere al valore statistico.
F>Se non ci tende allara e' il valore statistico che e' sbagliato e non
F>il contrario.
...eh eh... stai facendo un po' di confusione con probabilità 'statistica' e
'teorica'.
In teoria è vero che la P statistica tende alla P teorica per N grandi, in
pratica non saprai mai quanto vicino sei alla P teorica (che comunque è la
sola ed unica che è matematicamente attendibile).
So che il post iniziale è di Darkluca, per accorciare il prg devi usare
un'array come ho fatto io e comunque se vuoi vincere ai dadi o a qualsiasi
altro gioco aleatorio non usare 'random'.
Bye
Ulisse

altro gioco aleatorio non usare 'random'.
Credo di essere d'accordo con Ulisse.
La funzione 'random' e' *legata* all'algoritmo di generazione dei
numeri casuali.
Proprio perche' i numeri generati non sono casuali ma *pseudo*casuali.
Per tanto non e' affidabile quale generatore di eventi aleatori.
Andrea Laforgia

Un bel di' fabioman scrisse:
f> Con N grande (tendente ad infinito) DEVE tendere al valore statistico.
f> Se non ci tende allara e' il valore statistico che e' sbagliato e non
f> il contrario.
f> 
personalmente (ma ne so poco e nulla) direi che se i 2 valori (teorico e
statistico) non coincidono, quello sbagliato e' quello teorico...
voglio dire: la teoria la si fa per avere informazioni sulla realta', se 
queste informazioni non coincidono (o non si avvicinano) non servono
a nulla.
Ciao!
-- 
Emanuele Cesena		
http://www.geocities.com/SiliconValley/Grid/8879
ami...@iol.it
 :)			 Occhio all'antispammer NOSPAZ!!
Scaricate ora Bubble 2000, ver. beta 1 :-)
http://gpi.eden.it/italianware/games/b2000b1.exe
 (900kb, ma il server e' buono!)
"Lavare la macchina per far piovere non funziona", legge dell'Inapplicabilita'

Un bel di' Ulisse scrisse:
U> for i:=1 to 6 do
U> for l:=1 to 6 do
U> for n:=1 to 6 do
U>      num[i+l+n]:=num[i+l+n]+1;
U> ......questo č tutto.... credo che piů semplice di cosě non esista proprio
U> altro.
U> 
3 for annidati lo definisci "semplice"?? :-))
Suvvia...
bye!
-- 
Emanuele Cesena		
http://www.geocities.com/SiliconValley/Grid/8879
ami...@iol.it
 :)			 Occhio all'antispammer NOSPAZ!!
Scaricate ora Bubble 2000, ver. beta 1 :-)
http://gpi.eden.it/italianware/games/b2000b1.exe
 (900kb, ma il server e' buono!)
"Note spese il cui totale e' divisibile per 1000 sono sempre guardate con
sospetto", principio di O'Brien (teoria delle 750 lire)

Andrea Laforgia
Fabio
--
fabi...@rocketmail.com

Ulisse
Fabio
--
fabi...@rocketmail.com

versione. La tua e' un'altra cosa.
...giusto, ma l'algoritmo di Darkluca non fa quello per cui è stato
sviluppato.
Bye
Ulisse

uniforme (e lo dovrebbe fare).
Non lo fa : e' questo il punto.
O meglio : non e' una simulazione affidabile.
Gli algoritmi di generazione di numeri casuali e che, essendo
algoritmi, generano per l'appunto numeri *pseudo-casuali* non sono
affatto affidabili se si vuole simulare un fenomeno aleatorio.
I vostri due algoritmi non forniscono affatto la distribuzione delle
probabilita' di uscita dei 16 numeri in questione per il semplice
fatto che la chiamata successiva della funzione random() non equivale
all'estrazione successiva di tre dadi.
Torno a ripetere che la funzione random() e' troppo legata alla
tecnica di generazione di numeri pseudo-casuali per simulare con
veridicita' un evento probabile.
Ad esempio, i bit meno significativi di un numero generato in modo
pseudo-casuale non sono affatto casuali, ma rispondono a un criterio
ben preciso e ripetitivo.
Andrea Laforgia

a nulla.
...il tuo ragionamento ha un fondamento di verità ma purtroppo è applicabile
solo se tiri 3 dadi per 10^9 volte, non se lo simuli al computer... non è la
stessa cosa... poi qui si tratta di metodologia di studio, probabilmente
(penso che proverò) i risultati che si ottengono con i due algoritmi
differiscono di pochissimo ma uno è formalmente corretto, l'altro no.
...che cosa c'è di 'complesso' in 3 cicli for annidati???
mica devi eseguirli tu a mano!!!
bye
Ulisse

Suvvia...
???? trovi complicati 3 for annidati ????
E se ti trovassi costretto a scrivere del codice ricorsivo allora ti
spareresti ? ;)
Andrea Laforgia

Un bel di' Ulisse scrisse:
U> ...il tuo ragionamento ha un fondamento di verità ma purtroppo è applicabile
U> solo se tiri 3 dadi per 10^9 volte, non se lo simuli al computer... non è la
U> stessa cosa... poi qui si tratta di metodologia di studio, probabilmente
U> (penso che proverò) i risultati che si ottengono con i due algoritmi
U> differiscono di pochissimo ma uno è formalmente corretto, l'altro no.
U> 
si', hai ragione.
In effetti la simulazione al PC non corrisponde alla realta'... :-)
U> ...che cosa c'è di 'complesso' in 3 cicli for annidati???
U> mica devi eseguirli tu a mano!!!
U> 
mi sembra semplicemente piu' semplice [:)] il programma del lancio
dei dadi, anche se poi il risultato che si ottiene e' differente :-)
-- 
Emanuele Cesena		
http://www.geocities.com/SiliconValley/Grid/8879
ami...@iol.it
 :)			 Occhio all'antispammer NOSPAZ!!
Scaricate ora Bubble 2000, ver. beta 1 :-)
http://gpi.eden.it/italianware/games/b2000b1.exe
 (900kb, ma il server e' buono!)
"Lasciate a se stesse, le cose tendono ad andare di male in peggio",
corollario 2 alla legge di Murphy

>Suvvia...
AL> 
AL> ???? trovi complicati 3 for annidati ????
AL> 
mah, piu' del programmino che simulava l'estrazione... :-)
AL> E se ti trovassi costretto a scrivere del codice ricorsivo allora ti
AL> spareresti ? ;)
AL> 
in effetti... :-))
Ciao!
-- 
Emanuele Cesena		
http://www.geocities.com/SiliconValley/Grid/8879
ami...@iol.it
 :)			 Occhio all'antispammer NOSPAZ!!
Scaricate ora Bubble 2000, ver. beta 1 :-)
http://gpi.eden.it/italianware/games/b2000b1.exe
 (900kb, ma il server e' buono!)
"3. Parla con autorita', ma soltanto di fatti ovvi e comprovati", dal
decalogo di Spark per il giovane manager