Ciao miky9757,
tutto sommato il problema è interessante, cioè capire come una simulazione del genere possa essere precisa. Ti posto una soluzione, che contiene sia il calcolo esatto, sia il calcolo simulato come serve a te.
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include <limits.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
using namespace std;
// -----------------------------------------------------------------------------------------
// Calcolo esatto
long Binomial(long n, long k)
{
long a = n - k;
if (a > k)
{
k = a;
a = n - k;
}
long result = 1;
while (n > k)
{
if (result >= UINT_MAX / n)
{
cout << "Overflow" << endl;
return 0;
}
result *= n--;
while (a > 1 && !(result % a))
result /= a--;
}
return result;
}
void CalcolaPerudo(int numeroDadi, int facceRichieste)
{
const double p = 1.0 / 6.0;
double probabilita = Binomial(numeroDadi, facceRichieste) * pow(p, facceRichieste) *
pow(1 - p, numeroDadi - facceRichieste);
cout << "Valore esatto: " << probabilita * 100 << endl;
}
// ---------------------------------------------------------------------------------------
// Simulazione
void SimulaPerudo(int numeroDadi, int facceRichieste, int valoreRichiesto)
{
double casiFavorevoli = 0;
srand(time(NULL));
for(int i = 0; i < 1000000; i++)
{
int tot = 0;
for(int j = 0; j < numeroDadi; ++j) // simulazione di un lancio di n dadi
{
int valoreDado = rand() % 6 + 1;
if( valoreDado == valoreRichiesto )
tot++;
}
if(tot == facceRichieste)
++casiFavorevoli;
};
double probabilita = casiFavorevoli / 1000000;
double probabilitaPercentuale = probabilita * 100;
cout << "la probabilita' che ci siano " << facceRichieste << " numeri " << valoreRichiesto
<< " e' del " << probabilitaPercentuale << "%" << endl;
}
int main()
{
int numeroDadi;
cout << "Quanti dadi si lanciano??? (da 2 a 25)" << endl;
cin >> numeroDadi;
if( numeroDadi > 25 || numeroDadi < 2) //al massimo si usano 25 dadi in perudo;
{
cout << "i valori validi sono da 2 a 25" << endl;
return 0;
}
int facceRichieste;
int valoreRichiesto;
cout << "Ora calcolero' la probabilita' che ci siano x dadi di valore y." << endl
<< "Scrivi x e poi y:" << endl;
cin >> facceRichieste >> valoreRichiesto;
SimulaPerudo(numeroDadi, facceRichieste, valoreRichiesto);
CalcolaPerudo(numeroDadi, facceRichieste);
_getch();
return 0;
}
Come vedrai i risultati forniti dalla simulazione sono piuttosto buoni, ad esempio con 25 dati e 5 facce uguali si ha 17.86% (simulato) contro 17.82% (esatto). Chiaramente più la probalibità diminuisce più il simulatore è impreciso.
La soluzione simulata ricalca quelle scritta da te, confrontandole potrai vedere cosa non andava.
Saluti dal tuo affezionato Professor Moriarty
(e mi racommando non usare mai più i goto).