Lancio dadi

Stato
Discussione chiusa ad ulteriori risposte.

edo1493

Utente Silver
13 Settembre 2008
79
16
1
79
Scrivere un programma che simuli il lancio di due dadi per 36.00 volte sommi i due risultati, visualizzate i risultati in un formato tabulare.

[ot]
Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 13


int main()

{

int frequenze[SIZE] = {0};

int x;
int y;
int k;
int somma;
int f;

srand( time( NULL ) );

for(x=1;x <= 36000; x++) {

y = 1 + ( rand() % 6 );

k = 1 + ( rand() % 6 );

somma = k + y;

++frequenze[somma];

}

printf( "%s%17s\n", "Rating", "Frequency");


for(f=0;f<=12;f++) 

  printf("%6d%17d\n",f,frequenze[f]);

return 0;

}
[/ot]

ecco il mio output:
Codice:
edo1493@IGNAZIO:~$ ./vettori2
Rating        Frequency
     0                0
     1                0
     2              995
     3             1946
     4             2996
     5             4044
     6             5011
     7             5918
     8             4993
     9             4186
    10             3004
    11               11
    12                4
:pacifistamg:
 
Va be lo lasciato :asd:

Quello che mi preoccupa di più è che la somma dell'output si aggira intorno ai 33000..
 
Guardando così i risultati, sembra un po' strano che su 36 mila lanci il dodici sia uscito solo 4 volte. Il fatto che ci sia una bella simmetria a partire dal 7, fa notare che bene o male ha senso come cosa. Prova a rilanciare i dadi, forse sbaglio, o forse è un caso, ma dimmi se effettivamente 11 e 12 compaiono sempre così poche volte.
 
fatto, ho aggiunto anche le percentuali approssimate (tanto sono sempre quasi uguali)
Codice:
#!/usr/bin/perl

$freq[int(rand(6))+int(rand(6))+2]++ for (1..36000);
$perc[$_] = sprintf "%.2f", $freq[$_]*0.0028 for 2..$#freq;
print $/;
print "$_\t$freq[$_]\t$perc[$_] %\n" for 2..$#freq;


ed ecco tre output
Codice:
oromis92@localhost:~/Scrivania$ perl dice.pl
2       949     2.66 %
3       1999    5.60 %
4       3039    8.51 %
5       4014    11.24 %
6       4919    13.77 %
7       5998    16.79 %
8       5026    14.07 %
9       3992    11.18 %
10      3074    8.61 %
11      2035    5.70 %
12      955     2.67 %
oromis92@localhost:~/Scrivania$ perl dice.pl
2       978     2.74 %
3       2014    5.64 %
4       3013    8.44 %
5       3962    11.09 %
6       5012    14.03 %
7       5865    16.42 %
8       5127    14.36 %
9       3920    10.98 %
10      3066    8.58 %
11      2018    5.65 %
12      1025    2.87 %
oromis92@localhost:~/Scrivania$ perl dice.pl
2       1061    2.97 %
3       2001    5.60 %
4       3037    8.50 %
5       3990    11.17 %
6       5155    14.43 %
7       5999    16.80 %
8       4820    13.50 %
9       4007    11.22 %
10      2958    8.28 %
11      1998    5.59 %
12      974     2.73 %


ecco il sorgente che chiede quanti lanci fare
Codice:
#!/usr/bin/perl

print "numero di lanci = ";
$freq[int(rand(6))+int(rand(6))+2]++ for (1..<>);
$somma += $freq[$_] for 2..$#freq;
$perc[$_] = sprintf "%.2f", $freq[$_]*100/$somma for 2..$#freq;
print $/;
print "$_\t$freq[$_]\t$perc[$_] %\n" for 2..$#freq;


edo1493 ha detto:
Quello che mi preoccupa di più è che la somma dell'output si aggira intorno ai 33000..

no... se è 36000 rimane 36000 no ?

:conigliomg:
 
Angelic Code ha detto:
Guardando così i risultati, sembra un po' strano che su 36 mila lanci il dodici sia uscito solo 4 volte. Il fatto che ci sia una bella simmetria a partire dal 7, fa notare che bene o male ha senso come cosa. Prova a rilanciare i dadi, forse sbaglio, o forse è un caso, ma dimmi se effettivamente 11 e 12 compaiono sempre così poche volte.

Si compaiono sempre poche volte...il 12 intorno alle 5 o 6...
L'esercizio specifica che il 7 dovrebbe uscire un sesto delle volte..
 
edo1493 ha detto:
Angelic Code ha detto:
Guardando così i risultati, sembra un po' strano che su 36 mila lanci il dodici sia uscito solo 4 volte. Il fatto che ci sia una bella simmetria a partire dal 7, fa notare che bene o male ha senso come cosa. Prova a rilanciare i dadi, forse sbaglio, o forse è un caso, ma dimmi se effettivamente 11 e 12 compaiono sempre così poche volte.

Si compaiono sempre poche volte...il 12 intorno alle 5 o 6...
L'esercizio specifica che il 7 dovrebbe uscire un sesto delle volte..

allora io ho fatto giusto.
il 7 mi esce sempre circa il 16.5% delle volte e dato che 16.5*6=99 sono a posto ;)
i valori dovrebbero essere
Codice:
2       2-3 % 1/36
3       5-6 % 1/18
4       8-8.5 % 1/12
5       11-11.5 % 1/9
6       13-14 % 1/7.2
7       16-17 % 1/6
8       13-14 % 1/7.2
9       11-11.5 % 1/9
10      8-8.5 % 1/12
11      5-6 % 1/18
12      2-3 % 1/36

ricavato da questa tabella
Codice:
0 1  2  3  4  5  6
  _________________
1|2  3  4  5  6  7
2|3  4  5  6  7  8
3|4  5  6  7  8  9
4|5  6  7  8  9 10
5|6  7  8  9 10 11
6|7  8  9 10 11 12
 
Codice:
shura@eeepc ~ $ ./dadi 
 2:       996    2.77%
 3:      2065    5.74%
 4:      2972    8.26%
 5:      4006   11.13%
 6:      5071   14.09%
 7:      5950   16.53%
 8:      5044   14.01%
 9:      4012   11.14%
10:      2937    8.16%
11:      1973    5.48%
12:       973    2.70%

http://sprunge.us/FOUf?c
 
Si oromis92 l'esercizio propone prima quella tabella..

Shura non ho capito il -2 del primo ciclo e l'ultima divisione comunque i valori del vettore li puoi portare a zero solo con int occ[11] = {0}
 
edo, dipende dal compilatore, ma non ne sono sicuro
comunque il -2 serve per non avere un vettore da 13 elementi ma da 11 senza stampare 0 e 1 che non si avranno mai. Esempio: numero 12 = 10 con un vettore che va da 0 a 10.
L'ultima divisione è per la percentuale, non importa nell'esercizio, ma io l'ho fatta per fare il figo.
 
il 12 esce così poche volte poiè può essere ottenuto solo dalla combinazione 6+6, mentre, ad esempio il 7 lo puoi ottenere con
2+5,5+2,6+1,1+6 ecc ecc
 
ruby
Codice:
#!/usr/bin/ruby
$a={} and puts "inserisci un numero"
(nm=gets.chop.to_i).times do $a[(s=(rand(6)+rand(6)+2)).to_s]!=nil ? $a[s.to_s]+=1 : $a[s.to_s]=1 end
$a.sort.each {|k| puts((k[0].length<2? ' '+k[0]: k[0]).to_s+"  > "+k[1].to_s+"   "+(k[1]*100/nm).to_s+"%") }
 
So che è un post vecchio :S ma credo non ci sia nessun problema se posto la mia soluzione :S
(RUBY facendo proprio la classe)
Codice:
#!/usr/bin/ruby
class Dadi
	def initialize(num = nil)
		@num = num.to_i if num != nil
		exit if num == nil
		@database = {}
		@num.times do |x|
			n = (rand(6)+rand(6)+2)
			if @database[n] == nil
				@database[n] = 1
			elsif
				@database[n] += 1
			end
		end
		self.printa
	end
	def printa
		@database.keys.sort.each do |x|
			puts "#{x}\t#{@database[x]}\t#{@database[x]*100/@num}%"
		end
	end
end
a = Dadi.new(ARGV[0]) if ARGV[0] != nil

^^
@cyd: ma perchè l'hai scritto in maniera cosi incasinata? , ma sopratutto non ho ancora capito perchè converti da intero a stringa :S comunque secondo me cosi rallenti solo il programma infatti:
Codice:
tla@TLA-WinterIsComing:~/prog/Ruby$ time ruby dadi.rb
2	2823	2%
...
12	2819	2%
real	0m0.918s
user	0m0.840s
sys	0m0.080s
tla@TLA-WinterIsComing:~/prog/Ruby$ time ruby dadi2.rb
10  > 8295   8%
...
 9  > 11200   11%
real	0m1.265s
user	0m1.180s
sys	0m0.084s
tla@TLA-WinterIsComing:~/prog/Ruby$
PS: Ho impostato 100000 lanci direttamente dal sorgente :S
 
Bah topic vecchiotto ^^ però dai metto pure la mia sempre in ruby ( PS: Assomiglia molto a quella di Cyd ma che ci possiamo fare, d'altronde è il metodo + efficace il suo:
Codice:
$lol = {} and (ARGV.first.to_i).times { $lol[(r = (rand(5)+rand(5)+2))] == nil ? $lol[r] = 1 : $lol[r] += 1 }
$lol.keys.sort.each {|x| puts "#{x}\t#{$lol[x]}\t#{$lol[x] * 100 / ARGV.first.to_i}%" }
:rulezmg:
 
Stato
Discussione chiusa ad ulteriori risposte.