Теория вероятностей и математическая статистика в 2 частях. Ч.2. Учебное пособие
.pdf
3!1!4! C43 исходов. Однако часть из них уже учтены выше, а именно те, которые заканчиваются на {1, 1} с фиксированным последним нулем.
Таких исходов ровно столько, сколько перестановок из 1 единицы и 1 нуля, т. е. 1!1!2! C12 . Обозначим найденное число еще неучтенных пе-
рестановок как l20 C43 C12 . Тогда рассматриваемому варианту соответствует m20l20 исходов.
Продолжим по аналогии перебирать еще не рассмотренные варианты. Пусть k 19. Нас интересует вариант {перестановка из 19 нулей и 19 единиц, перестановка из 4 единиц и 2 нулей, 0}. Второй переста-
новке соответствует C64 исходов. Исключим из них те, которые заканчиваются на {1, 1} с фиксированным последним нулем. Число таких исходов составляет число перестановок из 2 единиц и 2 нулей: C42 . Кроме того, нужно вычесть уже учтенные l20 перестановок из 3 еди-
ниц и 1 нуля. Их нужно умножить на число перестановок из 1 единицы и 1 нуля, т. е. на C12 . Тогда l19 C64 C42 С12l20 . А общее число исходов для этого варианта равно m19l19 .
Полученные соотношения распространяются и на ситуации, когда k 19 . Читатель легко может убедиться в этом сам, пересчитав исхо-
ды, не пересекающиеся с уже рассмотренными.
В итоге получаем следующее соотношение для расчета числа благоприятных событию A исходов:
|
|
|
22 |
|
|
|
|
m mk lk , |
(29) |
|
|
|
k 1 |
|
|
|
1, l22 i C2i i1 |
i 1 |
|
где l22 |
l21 |
C2j jl22 i j , i 2, ,21. |
|
|
|
|
|
j 1 |
|
В прил. Л представлена реализация расчета числа благоприятных исходов по соотношению (29). Для того чтобы найти вероятность интересующего нас события, разделим найденное число исходов m на общее число исходов, заданное соотношением (28). В итоге получим,
что P(A) 0,977778.
91
Для проверки этого результата с помощью статистического определения вероятности, необходимо сгенерировать случайные перестановки, состоящие из 22 нулей и 23 единиц. Условие, что хотя бы один раз число вынутых бюллетеней, поданных за разных кандидатов, будет одинаково, можно выразить несколькими способами. Здесь выбран следующий прием (прил. Л).
Сначала подсчитаем, сколько бюллетеней за второго кандидата было вынуто при каждом изъятии. Поскольку они у нас отмечены единицами, то достаточно найти накопленную сумму элементов последовательности для каждого вынимания бюллетеней. Она записывается в вектор bul2. Теперь учтем, что совпадать число бюллетеней может только на четных позициях вектора bul2. Поэтому удалим элементы на нечетных позициях. И наконец, в случае совпадения элемент на i-й четной позиции будет равен i, т. е. при втором вынимании кумулятивная сумма будет равна 1, на четвертом – 2 и т. д. Для того чтобы это проверить, отнимем от четных элементов вектора bul2 элементы последовательности от 1 до 22 и подсчитаем число нулевых разностей. Если это число не равно нулю, то возвращается TRUE, т. е. сгенерированная перестановка соответствует благоприятному событию. Для большого числа перестановок подсчитаем, сколько будет благоприятных событий, и поделим на общее их число (число сгенерированных перестановок). В результате получим значение примерно 0,978, что
соответствует рассчитанному выше. Как видим, весьма маловероятно, что число бюллетеней вообще ни разу не совпадет.
Ответ: P(A) 0,977778.
92
СПИСОК ЛИТЕРАТУРЫ
1.Шипунов А.Б. и др. Наглядная статистика. Используем R! – М.: ДМК Пресс. – 2012. – 297 с.
2.Зарядов И. С. Введение в статистический пакет R: типы переменных, структуры данных, чтение и запись информации, графика. – М.: РУДН. – 2010. – 207 с.
3.Мастицкий С.Э., Шитиков В.К. (2014) Статистический анализ и визуализация данных с помощью R. – Электронная книга. – Режим доступа: http://r- analytics.blogspot.com.
4.Статистический анализ данных в системе R: учебное пособие / А.Г. Буховец, П.В. Москалев, В.П. Богатова, Т.Я. Бирючинская; под ред. проф. Буховца А.Г. – Воронеж: ВГАУ, 2010. – 124 с.
5.Шитиков В.К., Розенберг Г.С. Рандомизация и бутстреп: статистический анализ в биологии и экологии с использованием R. – Тольятти: Кас-
сандра, 2013. – 305 с.
6.Adler J. R in a nutshell: A desktop quick reference. – O'Reilly Media, Inc., 2010. – 611 p.
7.Феллер В. Введение в теорию вероятностей и ее приложения, Т. 1. – М.:
Мир, 1984. – 498 с.
8.Математики тоже шутят / автор-сост. С.Н. Федин. – М.: ЛЕНАНД, 2014. – 264 с.
9.Мостеллер Ф. Пятьдесят занимательных вероятностных задач с решениями. – М.: Наука, Гл. ред. физ.-мат. лит., 1975. – 112 с.
10.Джонсон Н.Л. Одномерные дискретные распределения / Н.Л. Джонсон, С. Коц, А.У. Кемп. – М.: БИНОМ. Лаборатория знаний, 2012. – 559 с.
93
ПРИЛОЖЕНИЯ
Приложение А
## Задача 1. Вероятности совпадения i человек
#1. Решение с помощью комбинаторных формул i = 0:7
PAi = choose(25-7,18-i) * choose(7,i) / choose(25,18)
#Вероятность того, что из них не менее 3 человек отсутствуют в списке
sum( PAi [1:5] )
#Условная вероятность
sum( PAi [2:5] ) / (1 - PAi [1])
#2. Решение с помощью перебора всех комбинация
#Загружаем библиотеку (перед этим ее нужно скачать и установить) library (combinat)
#Генерируем все возможные списки, включающие 18 студентов из 25 vcom = combn (1:25, 18)
#Для каждого списка (столбца vcom) считаем, сколько элементов совпадают с 1:7
sovp = apply (vcom, 2, function(x) sum (1:7 %in % x) )
#Строим таблицу распределения
tt = table (sovp) tt / sum (tt)
#3. Решение с помощью моделирования
#Генерируем 106 случайных выборок без возращения 18 элементов из
25
all_samples=replicate (10^6, sample (25, 18))
#Для каждой случайной выборки (столбца all_samples) считаем, сколько элементов совпадают с 1:7
sovp_rand=apply (all_samples, 2, function(x) sum (1:7 %in % x) )
#Строим таблицу распределения
tt_rand = table (sovp_rand) tt_rand / sum (tt_rand)
94
Приложение Б
## Задача 2. Геометрическое представление задачи о дуэлянтах plot(0,0,xlim=c(0,60),ylim=c(0,60),xaxs="i",yaxs="i",xlab="x",ylab="y",type=" n")
polygon(c(0,0,50,60,60,15,0),c(0,10,60,60,45,0,0),density=10)
#При условии, что первый дуэлянт уже прождал 5 минут plot(0,0,xlim=c(0,60),ylim=c(0,60),xaxs="i",yaxs="i",xlab="x",ylab="y",type=" n")
polygon(c(0,0,55,60,60,15,0),c(0,5,60,60,45,0,0),col="gray")
polygon(c(0,0,50,55,0),c(5,10,60,60,5),density=10)
#Решение с помощью моделирования
#Генерируем 105 случайных пар чисел
all_samples = replicate (10^5, runif (2,0,60) )
#Для каждой случайной выборки (столбца all_samples) считаем, сколько элементов удовлетворяют условию
sovp_rand = apply (all_samples, 2, function(x)
{if (x[1] < x[2]) x[2] - x[1] < 10 else x[1] - x[2] < 15})
#Определяем число удачных экспериментов
tt_rand = sum (sovp_rand)
#И делим его на общее число экспериментов tt_rand / length (sovp_rand)
#Условная вероятность
usl = apply (all_samples, 2, function(x) { (x[2] > x[1] + 5) | (x[2] +15 < x[1])})
#Результаты экспериментов в редуцированном пространстве sovp_rand_usl = sovp_rand [usl]
#Условная вероятность
sum (sovp_rand_usl) / length (sovp_rand_usl)
95
Приложение В
## Задача 3. Изображение мишени
#Задаем графические параметры: шрифт и его размер par (family="serif", ps=14)
#Создаем графическое окно с точкой в центре
plot (0, 0, xlim=c(-5,5), ylim=c(-5,5), pch=19, axes=FALSE, xlab="", ylab="")
#Последовательно добавляем линии окружности и текст с количеством очков
for (i in 1:5) {
curve ( sqrt(i^2-x^2), from=-i, to=i, add=TRUE) curve ( -sqrt(i^2-x^2), from=-i, to=i, add=TRUE) text (0, i-0.5, 10-i)
}
#Вероятности попадания в каждое кольцо мишени
vv0 = vv = c ( 1/5^2, diff ( (1:5)^2 ) / 5^2)
#Многомерный массив сумм номер колец мишени, пораженных за 7 выстрелов
m = 1:5
for (i in 2:7) m = outer (m, 1:5, "+")
#Условие, что сумма номеров 30
usl = m>=30
#Многомерный массив вероятностей реализации сумм из массива m for (i in 2:7) vv = outer (vv0, vv, "*")
#Распределение суммы номеров колец мишени, пораженных за 7 выстрелов
tapply ( vv, m, sum)
#Вероятность того, что сумма номеров колец 30
sum (vv [usl] )
96
Приложение Г
## Задача 4. Функция вероятности совпадения i вопросов в блоке
PAi = function (i) choose (4, i) * choose (16, 4 - i) / choose (20,4) i = 0:4
PAi (i)
#Функция для генерации размещений с повторениями из элементов n по k
razm = function (n, k) { rr = NULL
for (i in 1:k) rr = cbind (rr, rep (1:n, each = n^(k - i) ) ) rr}
#Все размещения из 5-ти элементов от 0 до 4-х по 5-ти позициям
rr0_4 = razm (5, 5) - 1
#Для каждого размещения (строки rr0_4) считаем сумму элементов sum_rr = apply (rr0_4, 1, sum)
#Условие, что сумма не превышает 10
uk = sum_rr <= 10
# Вероятность каждого размещения
prob = apply (rr0_4, 1, function (x) prod (PAi (x) ) )
#Суммируем вероятности размещений, элементы которых в сумме не более 10
sum (prob [uk])
#Распределение числа повторяющихся вопросов в тесте
tapply (prob, sum_rr, sum)
#Редуцированное пространство исходов usl = rr0_4 [, 5] == 0
rr0_4_reduce = rr0_4 [usl, ]
#Условная вероятность
uk = apply (rr0_4_reduce, 1, sum) <= 10
prob = apply (rr0_4_reduce, 1, function (x) prod (PAi (x) ) ) sum (prob [uk]) / PAi (0)
97
Приложение Д
## Задача 5. Таблица распределения суммы очков при подбрасывании двух кубиков
#Варианты очков на одном кубике v1 = 1:6
#Варианты суммы очков при подбрасывании двух кубиков v2 = outer (v1, v1,"+")
#Таблица с числом уникальных вариантов (после двух бросков) t2 = table (v2)
#Таблица распределения суммы очков после двух бросков
p2 = t2 / sum(t2)
#Вероятности выпадения каждого «пойнта»
P_point = p2 [c ("4", "5", "6", "8", "9", "10")]
#Вероятности продолжения игры после выпадения каждого «пойнта»
P_B2 = (1 - p2 ["7"]) - P_point
#Расчет условной вероятности выигрыша при выпадении «пойнта» w1 = 0
delta = 1
#delta – это малая величина, допустимая разница между двумя соседними членами убывающей прогрессии
while ( delta > (10^(-7)) ) { wn = P_point + P_B2 * w1 delta = max (wn - w1) w1 = wn
}
wn
#Вероятность выиграть в игре «крэпс»
8/36 + sum (P_point * wn)
98
Приложение Е
## Задача 6. Пустой список для числа благоприятных исходов mij
M = list ()
#Цикл по загаданному числу i for (i in 1:6){
#Очки, при выпадении которых броски продолжаются ss = (1:6) [ -i ]
#Число благоприятных исходов, если число i выпало на первом брос-
ке
M [[i]] = sum (i <= 20)
#Число благоприятных исходов, если число i выпало только на втором броске
m_ij = sum (i + ss <= 20)
#Начальные суммы очков; соответствующее каждой сумме число исходов
ss0 = ss; pp0 = rep (1, 5)
#Цикл по числу бросков, пока число благоприятных исходов не обнулится
while (m_ij!= 0) {
M [[i]] = c ( M [[i]], m_ij )
#Варианты сумм до k-го броска, если число i выпало только на k-м
броске
sum_k = c ( outer ( ss, ss0, "+") )
#Вектор с числом исходов, соответствующих суммам из sum_k pp_vect = rep (pp0, each = length (ss) )
#Таблица с числом уникальных вариантов
pp0 = table (sum_k)
#Возможные суммы очков до k-го броска при выпадении i на k-м броске
ss0 = as.numeric ( names (pp0) )
#Просуммируем число исходов, благоприятных реализации каждой суммы
pp0 = tapply (pp_vect, sum_k, sum)
#Найдем число исходов, благоприятных тому, что сумма очков не превышает 20
m_ij = sum (pp0 [ i + ss0 <= 20 ] ) }}
#Итоговый список числа исходов, благоприятных событию A Ri S j
M
# Для расчета вероятности события A необходимо к каждому компоненту списка применить одну и ту же функцию
99
#Функция, применяемая к каждому компоненту списка fun = function (x) sum ( x / 6 ^ ( 1:length (x) +1) )
#Вероятности события A при каждом загаданном числе
PAi = mapply ( fun, M )
#Итоговое значение вероятности события A
sum (PAi)
#Решение с помощью моделирования
#1. Использование цикла (более медленный вариант)
#Функция, проверяющая условие, что сумма очков не превышает 20 test = function () {
#Загаданное случайное число от 1 до 6
z = sample (6, 1) st = 0; s = 0
#Цикл суммирующий очки, пока не выпадет z или сумма не превысит
20
while ( st!= z & s <= 20 ) { st = sample (6, 1)
s = s + st
}
s <= 20}
usl_rand = replicate (10^6, test() )
#Определяем число удачных экспериментов
tt_rand = sum (usl_rand)
#И делим его на общее число экспериментов tt_rand / 10^6
#2. Моделирование результатов всех бросков (более быстрый вариант)
#Генерируем 106 случайных выборок с возращением: результатов 19 бросков кубика и загаданное число на кубике (последняя 20-я строка) all_samples = replicate ( 10^6, sample (6, 20, replace = TRUE) )
#Функция, суммирующая все элементы вектора v до первого появления константы x включительно
fun = function (v, x) {
#Номера элементов вектора v, равных константе x
No = which (v == x)
#Номер 1-го появления константы x или последнего элемента вектора v, если x не появлялся
nn = if ( length ( No )!= 0 ) No [1] else length (v)
#Сумма элементов вектора v с 1-го до номера первого появления константы x включительно или до последнего элемента, если x не появлялся
sum ( v [ 1:nn ] )
100
