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 ]