Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Образовательный студенческий форум _ Теория вероятностей _ Интересная задача, помогите решить

Автор: BlackGad 20.1.2009, 22:24

Столкнулся с задачей - условно есть 2 шеренги стрелков, одна из них атакующая, вторая оборонительная. Атакующая производит залп.
Задача: определить процент попадания Атакующих солдат по 1, 2, 3, ... раз по 1 воину обороны.
попадание атакующих солдат 100%.

пример 1:

атакующих 2000
оборонительных 2000
распределение:

попаданий|количество атакующих|процент от общего числа атакующих
1 |797 |0,3985
2 |722 |0,361
3 |348 |0,174
4 |108 |0,054
5 |25 |0,0125
Сумма |2000

пример 2:

атакующих 1000
оборонительных 2000
распределение:

попаданий|количество атакующих|процент от общего числа атакующих
1 |591 |0,591
2 |306 |0,306
3 |84 |0,084
4 |4 |0,004
5 |15 |0,015
Сумма 1000


пример 3:

атакующих 2000
оборонительных 1000
распределение:

попаданий|количество атакующих|процент от общего числа атакующих
1 |258 |0,129
2 |538 |0,269
3 |546 |0,273
4 |396 |0,198
5 |180 |0,09
6 |60 |0,03
7 |14 |0,007
8 |8 |0,004
Сумма 2000


примеры сгенерированы и подсчитаны обычной симуляцией, нужно определить математическую формулу распределения.

Могу начертить графики распределения smile.gif если необходимо...
Помогите пожалуйста.

Автор: malkolm 20.1.2009, 22:38

А каким образом выбирается, куда кто стреляет?

Автор: BlackGad 20.1.2009, 22:44

Цитата(malkolm @ 20.1.2009, 22:38) *

А каким образом выбирается, куда кто стреляет?


алгоритм симуляции

для каждого атакера из всех атакеров
рандом от 1 до количества защитников
количество попаданий по данному защитнику + 1


далее просто группировка по количеству попаданий всех защитников

если шарп или с++ знаком то вот:

int attackCount = 1000;
int defendCount = 2000;

Random r = new Random();
for (int i = 0; i < attackCount; i++)
{
int index = r.Next(defendCount);
if (!attack.ContainsKey(index)) attack.Add(index, 0); // если в списке цели с индексом index нет, добавляем новую запись с 0 попаданий
attack[index]++; //добавляем попадание по защитнику с индексом index
}

Автор: malkolm 20.1.2009, 22:54

А по-русски можно? Подробно механизм: кто куда стреляет? Или как определяется количество попаданий по данному защитнику Васе Пупкину?

Автор: BlackGad 20.1.2009, 23:12

Цитата(malkolm @ 20.1.2009, 22:54) *

А по-русски можно? Подробно механизм: кто куда стреляет? Или как определяется количество попаданий по данному защитнику Васе Пупкину?


каждый атакующий стреляет 1 раз, причем всегда попадает в противника.

выбор цели для атакующего равновероятный - тоесть (1 любой защитник).
после того, как выстрелили все атакующие: производится подсчет защитников,
1 группа - защитники по которым не попали
2 группа - защитники по которым попали 1 раз
3 группа - защитники по которым попали 2 раза
.....
n группа - защитники по которым попали n+1 раз

если просуммировать количество защитников всех групп - получится общее количество защитников(2000)

теперь определяем количество атакующих для всех групп
1 группа - игнорируется
2 группа - количество атакующих на эту группу = количеству группы*1
3 группа - количество атакующих на эту группу = количеству группы*2
.....
n группа - количество атакующих на эту группу = количеству группы*(n+1)

ну и выводим процент распределения - количество атакующих группы / на общее количество атакующих

нужно найти мат формулу, которая определяет процент распределения без симуляции.

Автор: malkolm 20.1.2009, 23:42

Понятно теперь, кто куда стреляет, непонятно другое. Числа, которе Вы получаете в результате моделирования, случайны. Количество защитников, в которых никто не стрелял, может быть любым от 0 до общего числа защитников минус 1. Точно так же количество защитников, в которых стрелял кто-то один, может быть любым от 0 до числа защитников. Ну и т.д. все эти числа есть случайные величины. Их нельзя найти ни по какой формуле.

Точно так же, как, бросая монету 10 раз, нельзя ни по какой формуле найти число выпавших орлов. Бросите сегодня - выпадет 4 орла. Завтра - 5, послезавтра - 2. А у меня вчера выпало 10.

Говорить тут можно только о нахождении каких-то вероятностей или математических ожиданий (средних значений). Но это Вы должны определиться, что именно хотите найти. Случайные величины не ищут, на то они и случайны.

Автор: BlackGad 20.1.2009, 23:56

smile.gif именно средние значение и нужны, я наверно, просто, не так выразился.

собственно могу вот 3 рисунка для 3 симуляций 1 исходных данных...

Изображение
Изображение
Изображение

надо найти среднее распределение... Теорию вероятности я подзабыл уже( потому ищу помощи

Автор: malkolm 21.1.2009, 0:07

Картинки ничего не объясняют. Ещё раз - на этих картинках для каждой отдельной серии экспериментов какие-то значения случайных величин получаются. Толку от них никакого. Я понимаю, что Вы тервер забыли, но чтобы что-то искать, нужно точно представлять, что именно.

Вас интересует вектор из матожиданий (средних значений) величин X(0),...,X(n), где X(i) - число защитников, атакованных i нападающими (или, что безразлично, доля к общему числу нападающих)?

Если так ставить задачу, можно подумать, это не должно быть сложно.

Автор: BlackGad 21.1.2009, 0:14

Да(судя по определению в вики smile.gif ) нужно найти вектор мат ожиданий величин для доли к общему числу нападающих...

Прошу прощения за неправильную постановку задачи

Автор: malkolm 21.1.2009, 0:18

Пусть есть m ящиков (защитники) и n шариков (нападающие). Каждый шарик с равной вероятностью и независимо от других кладётся в любой из m ящиков.

Пусть X(0) - число пустых ящиков, X(1) - число ящиков с одним шариком и т.д. до X(n) - числа ящиков с n шариками.

Тогда математическое ожидание M(X(i)) равно C_n^i * (m-1)^{n-i} / m^{n-1} = ( n! / i!*(n-i)! ) * (m-1)^{n-i} / m^{n-1}.

И так по каждой компоненте при i = 0,...,n

Скажем, при n=2000, m=2000, i =1 (у Вас там получалось 735, 704, 759)
M(X(1)) = 2000*(1999/2000)^1999 ~ 735,9428757.


Для "долей" - просто поделите результаты на число нападающих.

Автор: BlackGad 21.1.2009, 0:19

Цитата(malkolm @ 21.1.2009, 0:18) *

Пусть есть m ящиков (защитники) и n шариков (нападающие). Каждый шарик с равной вероятностью и независимо от других кладётся в любой из m ящиков.

Пусть X(0) - число пустых ящиков, X(1) - число ящиков с одним шариком и т.д. до X(n) - числа ящиков с n шариками.

Тогда математическое ожидание M(X(i)) равно C_n^i * (m-1)^{n-i} / m^{n-1} = ( n! / i!*(n-i)! ) * (m-1)^{n-i} / m^{n-1}.

И так по каждой компоненте при i = 0,...,n

Скажем, при n=2000, m=2000, i =1 (у Вас там получалось 735, 704, 759)
M(X(1)) = 2000*(1999/2000)^1999 ~ 735,9428757.
Для "долей" - просто поделите результаты на число нападающих.


то, что нужно... спасибо вам thumbsup.gif

Автор: malkolm 21.1.2009, 0:28

Не за что, это не сложно. Вероятности искать было бы хуже smile.gif
Игрушку делаете?

Автор: BlackGad 21.1.2009, 0:58

мм а можно пример для 2 и 3 выстрелов, а то либо я в формулу не так подставил, либо что-то не то выходит?

smile.gif игрушка есть уже... но бои по 25 сек считаются для 200000 выстрелов... а это далеко не предел того, что может быть, ищем оптимизацию.

И возможно есть более простые формулы? те степень 1999 это многовато)... возможно есть хоть ссылки на подобные статьи, материалы?

Автор: malkolm 21.1.2009, 7:09

Возводить в большую степень можно с помощью логарифмирования: a^b = exp(b*ln(a)). Ну и делать это надо с дробью, а не с числителем-знаменателем в отдельности.

Для двух-трёх?
M(X(2)) = (2000! / 2! * 1998!) * 1999^1998 / 2000^1999 = (2000 * 1999 /2) * (1999/2000)^1998 / 2000 = 367,9714379 (Excel)

M(X(3)) = (2000! / 3! * 1997!) * 1999^1997 / 2000^1999 = (2000 * 1999 * 1998 / 6) * (1999/2000)^1997 / 2000^2 = 122,5957867 (Excel)

У Вас там в картинках 0 попаданий - это, наверное, как раз 1-я группа? Для i=0 матожидание равно 735,5749043.

Вообще Excel отлично это всё считает:
=2000*ЧИСЛКОМБ(2000;B1)*(1999/2000)^(2000-B1)/2000^B1

Код

735,5749043    0
735,9428757    1
367,9714379    2
122,5957867    3
30,6182824    4
6,1144664    5
1,017038558    6
0,144927813    7
0,018061601    8
0,001999817    9
0,000199181    10
1,80259E-05    11
1,49464E-06    12
1,1434E-07    13
8,1181E-09    14
2000

Автор: BlackGad 21.1.2009, 11:25

спасибо smile.gif

есть мысль просто зарание просчитать для прорции атакера/защитника занести в масив и множить мгновенно... только вот точность страдать будет smile.gif

на глаз видно быть не должно, при милионных толпах

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)