Advertisement
Guest User

Untitled

a guest
Jun 4th, 2015
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.54 KB | None | 0 0
  1. // Run: g++ -std=c++11 prob.cpp -o prob && ./prob
  2.  
  3. #include<iostream> // std::cout
  4. #include<iomanip> // std::endl
  5. #include<cstdlib> // rand
  6. #include<cmath> // sqrt
  7. #include<exception> // class std::exception
  8. #include<stdexcept> // class std::logic_error
  9.  
  10. typedef uint TCounter;
  11. typedef char TCoin;
  12.  
  13. const TCounter iterations_max = 10000;
  14.  
  15. TCounter answer[2]={0,0}; // Ответ: количество вытащенных монет каждого типа
  16.  
  17. const TCoin c_gold=0; // Золотая монета
  18. const TCoin c_silver=1; // Серебряная монета
  19.  
  20. static_assert( c_gold<sizeof(answer)/sizeof(TCounter) && c_gold>=0, "Gold constant shall act as index of 'answer' array; but now it is out of range");
  21. static_assert( (c_silver<sizeof(answer)/sizeof(TCounter)) && c_silver>=0, "Silver constant shall act as index of 'answer' array; but now it is out of range");
  22.  
  23.  
  24. // Сундуки и монеты в них
  25. const TCoin chest_coin[]={c_gold,c_gold , c_gold,c_silver, c_silver,c_silver};
  26.  
  27. class EFirstNonGold:public std::exception {
  28. public:
  29.     virtual const char* what() const noexcept {return "На первом шаге выбрана не золотая монета. Но вы не должны этого видеть, иначе ошибка в коде.\n";}
  30. };
  31.  
  32.  
  33. // Функция, которая просто проверяет качество генератора случайных чисел
  34. void test_rand()
  35. {
  36. #define CASES 10
  37.     TCounter i;
  38.     TCounter hits[CASES]={0,0,0,0,0,0,0,0,0,0};
  39.     float mean;
  40.     float variance;
  41.  
  42.     for (i=0;i<iterations_max;i++)
  43.         hits[ rand() % CASES ]++;
  44.    
  45.     std::cout << "Проверка генератора случайных чисел: ";
  46.    
  47.     mean=0;
  48.     for (i=0;i<CASES;i++){
  49.         mean += hits[i];
  50.         std::cout << hits[i] << ", " ;
  51.     }
  52.     mean /= CASES;
  53.  
  54.     variance=0;
  55.     for (i=0;i<CASES;i++)
  56.         variance += ( hits[i] - mean ) * ( hits[i] - mean );
  57.    
  58.     variance /= (CASES-1);
  59.  
  60.     std::cout << "мат. ожидание=" << mean << ", с.к.о=" << sqrt(variance);
  61.  
  62.     std::cout << std::endl;
  63. };
  64.  
  65. // Единичный тест
  66. TCoin test()
  67. {
  68.     uint chest_coin_choice; // Сундук и монета
  69.  
  70.     chest_coin_choice=rand()%6; // Выбирам сундук и монету
  71.     if (chest_coin[chest_coin_choice] != c_gold ) // Если монета не золотая, прерываем эксперимент
  72.         throw EFirstNonGold();
  73.    
  74.     if (chest_coin_choice%2 == 1) // Если из сундука была выбрана вторая монета...
  75.         chest_coin_choice--; // ... то следущей будет первая из того же сундука
  76.     else
  77.         chest_coin_choice++; // ... иначе следующей будет вторая из того же сундука
  78.    
  79.     return chest_coin[chest_coin_choice]; // Возвращаем следующую вытащенную монету
  80.  
  81. }
  82.  
  83. int main()
  84. {
  85.     TCounter i;
  86.     TCoin c_gold_cnt=0;
  87.     TCoin c_silver_cnt=0;
  88.        
  89.     test_rand();
  90.  
  91.     // Производим нужное количество тестов
  92.     for (i=0;i<iterations_max;i++)
  93.         try{
  94.             answer[ test() ]++; // Производим тест, записываем результат
  95.         } catch (EFirstNonGold e){}; // Если первая выбранная монета не золотая, просто пропускаем этот тест
  96.    
  97.     std::cout << "Вытащено золотых монет: " << answer[c_gold] << std::endl;
  98.     std::cout << "Вытащено серебряных монет: " << answer[c_silver] << std::endl;
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement