Для действующей задачи существует программный модуль на 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 процента.
нужно разъяснить в чем причина