C++ Bc. 37 cpp

Z GeoWikiCZ
#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 ]