Guest User

Untitled

a guest
Jul 22nd, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <random>
  4.  
  5. #define denom 0.01 //Точность
  6. #define loops 10000 //Количество циклов в симуляции
  7. #define iter 5 //Количество симуляций
  8. #define eps 10000 //Констнта event_p
  9.  
  10. //Время работы O(C*N); C = iter*loops*c;
  11. //Меняя iter и loops таким образом, чтобы iter*loops неизменялось
  12. //Можем повысить (или понизить) точность вычислений
  13.  
  14. //Согласно стандарту C++, принцип работы std::random_device отдаётся на откуп разработчикам компилятора
  15. //Таким образом, в зависимости от компилятора, платформы может серьезно зависить время работы и точность вычислений
  16. //При тестировании использовался MVSC (cl.exe) версии 14.13.26128.0 в x64 Windows 10
  17. //Код работает только с C++11 и выше
  18.  
  19. using namespace std;
  20.  
  21. typedef unsigned long long ullint;
  22. typedef unsigned short int usint;
  23.  
  24. //Глобальные структуры для randomer()
  25. mt19937 engine;
  26. random_device device;
  27.  
  28. ullint randomer() //Собственный рандом: генерация псевдослучайных чисел методом Вихря Мерсенна
  29. {
  30. engine.seed(device());
  31. std::uniform_int_distribution<unsigned> distribution(0, eps);
  32. return distribution(engine);
  33. };
  34.  
  35. bool event_p(double probability) //С вероятностью probability вернет true
  36. {
  37. ullint border = probability * eps;
  38. return (randomer()) < border;
  39. }
  40.  
  41. double simulation(usint N, usint K, const double *probs) //Симуляция охоты loops раз. Возвращает ~вероятность успешной охоты
  42. {
  43. ullint good_hunts = 0; //Количество удавшихся охот
  44. for (ullint hunts = 0; hunts < loops; hunts++)
  45. {
  46. usint kills = 0; //Количество убийств за одну охоту
  47. for (usint i = 0; i < N; i++)
  48. {
  49. if (event_p(probs[i]))
  50. kills++;
  51. }
  52. if (kills >= K)
  53. good_hunts++;
  54. };
  55. return (double)good_hunts / loops; //Чтобы посчитать вероятность успешной охоты делим количество хороших случаев на все случаи.
  56. }
  57.  
  58. int main() {
  59.  
  60. usint N, K;
  61. cin >> N >> K;
  62.  
  63. //TEST
  64. /*
  65. ullint tests = 0;
  66. for (ullint i = 0; i < loops; i++)
  67. {
  68. if (event_p(0.5))
  69. {
  70. tests++;
  71. };
  72. };
  73. cout << tests << endl;
  74. */
  75. double *probs = new double[N];
  76. for (usint i = 0; i < N; i++)
  77. {
  78. cin >> probs[i];
  79. };
  80.  
  81. double ans = 0; //Среднее арифмитеческое значений возвращаемых simulation;
  82. for (usint i = 0; i < iter; i++)
  83. {
  84. ans += simulation(N, K, probs);
  85. };
  86. ans = ans / iter;
  87. cout << "Prob: " << (ans - remainder(ans, denom))/*Округляем*/ << endl;
  88.  
  89. system("pause");
  90. delete[] probs;
  91. return 0;
  92. }
Add Comment
Please, Sign In to add comment