Для діючого завдання існує програмний модуль на c#, в якому в ітеративному режимі можна отримати результати випробувань і розрахувати ймовірності.
Є ігровий цикл (для розрахунків приймаємо безкінечний), в якому є дві події.
Перша подія є основною в ігровому циклі.
Друга - додаткова, її поява залежить від потрібної умови в першій події.
В першій події створюється одномірний масив з 20 елементів.
int[] array = new int[20];
- Вибираємо кількість елементів, в які буде здійснено запис. Кожен запис - це значення номіналу монети.
З першого масиву, який визначає вагу кількості записуваних елементів.
int[] freq_element = new int[] { 170000, 300000, 285000, 178000, 59500, 4410, 2340, 720, 30 };
З другого масиву, який визначає кількість елементів запису
int[] count_element = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
- Рандомом вибираємо позиції елементів в масиві в кількості, отриманому вище.
При тому, що якщо рандомом потрапляємо вже в зайняту позицію, то вибираємо нову позицію.
- Присвоюємо значення вибраним елементам.
З першого масиву, який визначає вагу номіналу монети.
int[] freq_base = new int[] { 19000, 8000, 4000, 2500, 1000, 800, 350, 500, 350, 80, 20, 6 };
З другого масиву, який визначає сам номінал монети.
int[] value_base = new[] { 1, 2, 3, 4, 5, 10, 15, 10, 20, 50, 70, 100 };
- Якщо кількість монет дорівнює 5 або більше, це визначає початок другої події
Друга подія.
Для залишених елементів 20 - N створюємо цикл для запису, де N - кількість монет в першій події.
Елементи масиву, в яких немає номіналу монет (відсутня запис про монету) за замовчуванням мають значення 0.
- По черзі для кожного елемента масиву, в якому знаходиться значення 0, визначаємо умову для запису нової монети
ймовірність запису визначається вагою з масиву
int[] new_write = new int[] { 14000, 36606 };
де елемент 0 - запису немає; елемент 1 - запис є
- Умова для запису встановлена, є запис
З першого масиву, який визначає вагу номіналу монети.
int[] freq_add = new int[] { 19000, 8000, 4000, 2500, 1000, 800, 350, 500, 350, 80, 20, 6 };
З другого масиву, який визначає сам номінал монети
int[] value_base = new[] { 1, 2, 3, 4, 5, 10, 15, 10, 20, 50, 70, 100 };
Яка буде середня сума значень/номіналів в масиві за умови настання другої події.
Яка буде середня сума значень/номіналів в масиві за умови настання другої події і додаткової умови :
- коли кількість монет в масиві дорівнює рівно 15, тоді множаться на X.
------------------------------------------------------------------------------------------------------------------
моє рішення:
є ймовірності для настання другої події
p(N=5) = 0.00441
p(N=6) = 0.00234
p(N-7) = 0.00072
p(N=8) = 0.00003
Ймовірність додавання нової монети
pHave = 36606 / (14000 + 36606) = 0.7234
Ймовірність відсутності монети
pLost = 1 - 0.7234 = 0.2766
очікуване середнє значення номіналу монети дорівнює
E = (1*19000 + 2 * 8000 + 3 * 4000....70 * 20 + 100 * 6) / (19000 + 8000 .... + 20 + 6) = 2.547
середнє значення монет в першій події
t_one = 5 * p(N=5) + 6 * p(N=6) + 7 * p(N=7) + 8 *p(N=8);
середнє значення монет у другій події
t_two = (p(N=5) * 15 * pHave) + (p(N=6) * 14 * pHave) + (p(N=7) * 13 * pHave) + (p(N=8) * 12 * pHave);
Середня підсумкова сума номіналів монет
S = (t_one + t_two) * E;
Ймовірнісний розрахунок повністю співпав з інтеративним результатом в діючій моделі на 1000000000 циклах.
Тепер в завданні з'являється додаткова умова (коли кількість монет дорівнює 15, тоді всі значення/номінали множаться на Х)
знаходимо ймовірність появи 15 записів при першій події 5 - 8 записів
p15_5 = BinomialCoefficient(15, 10) * Math.Pow(pHave, 10) * Math.Pow(pLost, 5) * p(N=5);
p15_6 = BinomialCoefficient(15, 9) * Math.Pow(pHave, 9) * Math.Pow(pLost, 5) * p(N=6);
p15_7 = BinomialCoefficient(15, 8) * Math.Pow(pHave, 8) * Math.Pow(pLost, 5) * p(N=7);
p15_8 = BinomialCoefficient(15, 7) * Math.Pow(pHave, 7) * Math.Pow(pLost, 5) * p(N=8);
остаточна ймовірність появи 15 записів дорівнює (вона майже дорівнює інтеративним вимірам)
p15_total = p15_5 + p15_6 + p15_7 + p15_8;
абсолютна ймовірність у другій події (ймовірність всередині бонусного циклу)
p15_absol = p15_total / (p(N-5) + p(N-6) + p(N-7) + p(N-8));
Середня сума номіналів при 15 монетах
M = 15; // кількість записів
X = 1; // множник
S15 = p15_total * M * X * E
Середня підсумкова сума значень/номіналів
S_total = S15 + (1 - p15_absol) * S;
В моєму уявленні S_total == S
але результат не збігається приблизно на 0.5 - 1.0 відсотка.
потрібно роз'яснити, в чому причина