Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <random>
- #define denom 0.01 //Точность
- #define loops 10000 //Количество циклов в симуляции
- #define iter 5 //Количество симуляций
- #define eps 10000 //Констнта event_p
- //Время работы O(C*N); C = iter*loops*c;
- //Меняя iter и loops таким образом, чтобы iter*loops неизменялось
- //Можем повысить (или понизить) точность вычислений
- //Согласно стандарту C++, принцип работы std::random_device отдаётся на откуп разработчикам компилятора
- //Таким образом, в зависимости от компилятора, платформы может серьезно зависить время работы и точность вычислений
- //При тестировании использовался MVSC (cl.exe) версии 14.13.26128.0 в x64 Windows 10
- //Код работает только с C++11 и выше
- using namespace std;
- typedef unsigned long long ullint;
- typedef unsigned short int usint;
- //Глобальные структуры для randomer()
- mt19937 engine;
- random_device device;
- ullint randomer() //Собственный рандом: генерация псевдослучайных чисел методом Вихря Мерсенна
- {
- engine.seed(device());
- std::uniform_int_distribution<unsigned> distribution(0, eps);
- return distribution(engine);
- };
- bool event_p(double probability) //С вероятностью probability вернет true
- {
- ullint border = probability * eps;
- return (randomer()) < border;
- }
- double simulation(usint N, usint K, const double *probs) //Симуляция охоты loops раз. Возвращает ~вероятность успешной охоты
- {
- ullint good_hunts = 0; //Количество удавшихся охот
- for (ullint hunts = 0; hunts < loops; hunts++)
- {
- usint kills = 0; //Количество убийств за одну охоту
- for (usint i = 0; i < N; i++)
- {
- if (event_p(probs[i]))
- kills++;
- }
- if (kills >= K)
- good_hunts++;
- };
- return (double)good_hunts / loops; //Чтобы посчитать вероятность успешной охоты делим количество хороших случаев на все случаи.
- }
- int main() {
- usint N, K;
- cin >> N >> K;
- //TEST
- /*
- ullint tests = 0;
- for (ullint i = 0; i < loops; i++)
- {
- if (event_p(0.5))
- {
- tests++;
- };
- };
- cout << tests << endl;
- */
- double *probs = new double[N];
- for (usint i = 0; i < N; i++)
- {
- cin >> probs[i];
- };
- double ans = 0; //Среднее арифмитеческое значений возвращаемых simulation;
- for (usint i = 0; i < iter; i++)
- {
- ans += simulation(N, K, probs);
- };
- ans = ans / iter;
- cout << "Prob: " << (ans - remainder(ans, denom))/*Округляем*/ << endl;
- system("pause");
- delete[] probs;
- return 0;
- }
Add Comment
Please, Sign In to add comment