Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Run: g++ -std=c++11 prob.cpp -o prob && ./prob
- #include<iostream> // std::cout
- #include<iomanip> // std::endl
- #include<cstdlib> // rand
- #include<cmath> // sqrt
- #include<exception> // class std::exception
- #include<stdexcept> // class std::logic_error
- typedef uint TCounter;
- typedef char TCoin;
- const TCounter iterations_max = 10000;
- TCounter answer[2]={0,0}; // Ответ: количество вытащенных монет каждого типа
- const TCoin c_gold=0; // Золотая монета
- const TCoin c_silver=1; // Серебряная монета
- 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");
- 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");
- // Сундуки и монеты в них
- const TCoin chest_coin[]={c_gold,c_gold , c_gold,c_silver, c_silver,c_silver};
- class EFirstNonGold:public std::exception {
- public:
- virtual const char* what() const noexcept {return "На первом шаге выбрана не золотая монета. Но вы не должны этого видеть, иначе ошибка в коде.\n";}
- };
- // Функция, которая просто проверяет качество генератора случайных чисел
- void test_rand()
- {
- #define CASES 10
- TCounter i;
- TCounter hits[CASES]={0,0,0,0,0,0,0,0,0,0};
- float mean;
- float variance;
- for (i=0;i<iterations_max;i++)
- hits[ rand() % CASES ]++;
- std::cout << "Проверка генератора случайных чисел: ";
- mean=0;
- for (i=0;i<CASES;i++){
- mean += hits[i];
- std::cout << hits[i] << ", " ;
- }
- mean /= CASES;
- variance=0;
- for (i=0;i<CASES;i++)
- variance += ( hits[i] - mean ) * ( hits[i] - mean );
- variance /= (CASES-1);
- std::cout << "мат. ожидание=" << mean << ", с.к.о=" << sqrt(variance);
- std::cout << std::endl;
- };
- // Единичный тест
- TCoin test()
- {
- uint chest_coin_choice; // Сундук и монета
- chest_coin_choice=rand()%6; // Выбирам сундук и монету
- if (chest_coin[chest_coin_choice] != c_gold ) // Если монета не золотая, прерываем эксперимент
- throw EFirstNonGold();
- if (chest_coin_choice%2 == 1) // Если из сундука была выбрана вторая монета...
- chest_coin_choice--; // ... то следущей будет первая из того же сундука
- else
- chest_coin_choice++; // ... иначе следующей будет вторая из того же сундука
- return chest_coin[chest_coin_choice]; // Возвращаем следующую вытащенную монету
- }
- int main()
- {
- TCounter i;
- TCoin c_gold_cnt=0;
- TCoin c_silver_cnt=0;
- test_rand();
- // Производим нужное количество тестов
- for (i=0;i<iterations_max;i++)
- try{
- answer[ test() ]++; // Производим тест, записываем результат
- } catch (EFirstNonGold e){}; // Если первая выбранная монета не золотая, просто пропускаем этот тест
- std::cout << "Вытащено золотых монет: " << answer[c_gold] << std::endl;
- std::cout << "Вытащено серебряных монет: " << answer[c_silver] << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement