C++ Bc. 37 cpp
#include <iostream>
#include <vector>
#include <ctime>
class Urna
{
public:
Urna();
void vloz (int barva, int pocet=1);
int vyjmi();
private:
std::vector<int> koule;
bool zamichat;
void zamichej();
};
enum {prvni, druha, treti};
enum {bila, cerna};
void pokus (int& barva, int& cislo)
{
Urna urna[3];
urna[prvni].vloz(bila, 2);
urna[prvni].vloz(cerna, 4);
urna[druha].vloz(bila, 4);
urna[druha].vloz(cerna, 2);
urna[treti].vloz(bila, 3);
urna[treti].vloz(cerna, 3);
cislo = int(3*(rand()/(RAND_MAX+1.0)));
barva = urna[cislo].vyjmi();
}
int main()
{
std::srand(std::time(0));
double total_bila_prvni = 0;
double total_bila_vsechny = 0;
double total_cerna_prvni = 0;
double total_cerna_vsechny = 0;
for (int t=1; t<=10; t++)
{
int bila_prvni = 0; // pocet bilych kouli z prvni urny
int bila_vsechny = 0; // pocet bilych kouli ze vsech uren
int cerna_prvni = 0;
int cerna_vsechny = 0;
const int N = 10000;
for (int barva, urna, i=1; i<=N; i++)
{
pokus(barva, urna);
if (barva == bila)
{
bila_vsechny++;
if (urna == prvni) bila_prvni++;
}
if (barva == cerna)
{
cerna_vsechny++;
if (urna == prvni) cerna_prvni++;
}
}
std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
std::cout.precision(3);
std::cout << " pa = " << double(bila_prvni)/bila_vsechny
<< " pb = " << double(cerna_prvni)/cerna_vsechny << std::endl;
total_bila_prvni += bila_prvni;
total_bila_vsechny += bila_vsechny;
total_cerna_prvni += cerna_prvni;
total_cerna_vsechny += cerna_vsechny;
}
std::cout << " -----------------------\n";
std::cout << " " << total_bila_prvni /total_bila_vsechny
<< " " << total_cerna_prvni/total_cerna_vsechny << std::endl;
}
Urna::Urna()
{
zamichat = true;
}
void Urna::vloz(int barva, int pocet)
{
for (int i=1; i<=pocet; i++) koule.push_back(barva);
zamichat = true;
}
int Urna::vyjmi()
{
if (zamichat) zamichej();
// if (koule.size() == 0) throw ...
const int barva = koule[0];
koule.erase(koule.begin());
return barva;
}
void Urna::zamichej()
{
const unsigned int N=koule.size();
for (unsigned int i=0; i<N-1; i++)
{
const int k = int((N-i)*(rand()/(RAND_MAX+1.0)));
std::swap(koule[i], koule[i+k]);
}
zamichat = false;
}
[ Zpět ]