C++ Bc. 39 cpp

Z GeoWikiCZ
Verze z 20. 1. 2008, 16:03, kterou vytvořil Cepek (diskuse | příspěvky) (opraven název fce pro výpočet rovnoměrného rozdělení)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání
#include <iostream>
#include <ctime>
#include <cstdlib>

inline double R01()
{
  return std::rand()/(RAND_MAX + 1.0);
}


bool neohrozujici_se_veze(int pocet_vezi)
{
  const int N = 8;
  int sachovnice[N][N] = {{0}};

  for (int i=0; i<pocet_vezi; i++)
    {
      int r, s;
      do 
        {
          r = int( R01()*N );
          s = int( R01()*N );
        }
      while (sachovnice[r][s] != 0);
      
      sachovnice[r][s] = 1;
    }


  for (int r=0; r<N; r++)
    {
      int pocet = 0;
      for (int s=0; s<N; s++)
        {
          pocet += sachovnice[r][s];
          if (pocet > 1) return false;
        }
    }

  for (int s=0; s<N; s++)
    {
      int pocet = 0;
      for (int r=0; r<N; r++)
        {
          pocet += sachovnice[r][s];
          if (pocet > 1) return false;
        }
    }

  return true;;
}



int main()
{
  std::srand(std::time(0));

  std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield);
  std::cout.precision(2);

  const long int      N = 1000000;    // pocet pokusu v jedne simulaci
  const long int veze[] = {8, 7, 6};  // pocet vezi v jednotlivych simulacich
  long int     celkem[] = {0, 0, 0};

  char* sep = " +-----------------------------------------------------------+";
  std::cout << sep << "\n" << " |";
  for (unsigned int k=0; k<sizeof(veze)/sizeof(int); k++)
    {
      std::cout.width(10);
      std::cout << veze[k] << "         |";         
    }
  std::cout << "\n" << sep << "\n";

  for (int s=1; s<=10; s++)
    {
      for (unsigned int k=0; k<sizeof(veze)/sizeof(int); k++)
        {
          int priznive_jevy = 0;
          for (int i=0; i<N; i++)
            if (neohrozujici_se_veze(veze[k]))
              priznive_jevy++;
          celkem[k] += priznive_jevy;

          std::cout << " | "
                    << double(priznive_jevy)/N << " "
                    << double(celkem[k])/(N*s);
        }

      std::cout << " |\n";
    }

  std::cout << sep << "\n";
}

[ Zpět ]