Подбрасывание монеты 4 раза подряд
Рассмотрим относительно не сложную задачу: монету подбрасываем четыре раза подряд, какая вероятность что все четыре раза выпадет орел? Эту задачу в среде R решить можно двумя способами: моделируя этот процесс с использованием циклов и условного оператора (и в этом случае мы получим довольно длинный скрипт), а можно что называется одной строкой. Начнем с первого способа.
Первый способ с использованием циклов while и for и условного оператора if. Все подробно опишем в самом скрипте. В самом начале зададим необходимые исходные данные:
# Задаем число испытаний
N = n = 100000
k = 0:1
allR = 0
Далее, собственно, реализуем первый способ практически: будем подбрасывать заданное число раз в нашем случае 100000 (конструкция реализована с циклом while – это цикл с условием, который будет выполнять код ниже заданное число раз).
В цикле for реализовано подбрасывание монеты четыре раза: ровно четыре раза будет выполнена конструкция s = c(s,sample(k,size = 1,replace = T)). Здесь благодаря функции sample из вектора k (в котором только два значения 0 и 1) случайно будут извлекаться один элемент, который будет добавлен к вектору s четыре раза подряд. Таким образов вектор s будет содержать ровно четыре исхода подбрасывания монеты (условимся что значению 1 соответствует «орел»). Как же работает эта функция?
Функция sample() в R используется для генерации случайных элементов из заданных данных с заменой или без неё. Синтаксис: sample(x, size, replace = FALSE, prob = NULL).
Параметры:
- x: вектор или список, содержащие элементы, из которых будет выбрана выборка.
- size: количество элементов для выбора. Если replace = TRUE, указывает количество элементов для выборки с заменой.
- replace: логическое значение, указывающее, следует ли делать выборку с заменой (TRUE) или без замены (FALSE). По умолчанию FALSE.
- prob: необязательный вектор весов вероятности для получения элементов x.
По умолчанию функция возвращает случайную перестановку входного вектора, то есть возвращает элементы вектора, но в другом порядке (без повторения каких-либо).
При установке replace = TRUE выборка делается с заменой, то есть один и тот же элемент может выбираться несколько раз.
Теперь нам необходимо выяснить и зафиксировать тот момент, когда четыре раза подряд выпадает «орел». Как это можно реализовать? А очень просто: с помощью условного оператора if. Мы просто найдем сумму всех элементов вектора s и если «орел» выпадет четыре раза подряд, то вектор s будет содержать «1, 1, 1, 1», или если просуммируем, то получим 4. Так что дальше реализуем этот момент так:
if(sum(s) == 4){
allR = allR + 1
И наконец после завершения процесса подбрасывания 4 раза монеты нам нужно уменьшить значение общего числа испытаний на единицу. И в самом конце скрипта просто подсчитать в процентах количество успешных испытаний.
Полный текст скрипта ниже:
# подбрасываем монету 4 раза подряд
# какая вероятность что 4 раза подряд выпадет орел
set.seed(555)
# Задаем число испытаний
N = n = 100000
k = 0:1
allR = 0
while(n > 1){
s = c()
for(j in 1:4){
s = c(s,sample(k,size = 1,replace = T))
}
if(sum(s) == 4){
allR = allR + 1
}
n = n -1
}
allR/N*100 # смоделированное значение вероятности
0.5^4*100 #истинное значение вероятности
|
> allR/N*100 # смоделированное значение вероятности [1] 6.119 > 0.5^4*100 #истинное значение вероятности [1] 6.25 |
Как видим наше значение приближается к точному значению 6.25. А теперь рассмотрим и второй способ решения (попробуйте в этом скрипте разобраться самостоятельно, поверьте это совсем несложно).
# N — количество наблюдений в одном test,
# n — общее количество test испытаний,
# p — вероятность успеха.
N = 1
n = 100000
p = (0.5)^4
allR = rbinom(N, n, p)
allR/n*100
Надеюсь вы смогли самостоятельно разобраться в скрипте выше. А теперь предлагаю еще один или третий способ решения задачи. Он заключается в том, что мы ставим условие в цикле в отличии от первого способа решения как определенное число положительных исходов при подбрасывании монеты четыре раза. И цикл будет продолжать работу до тех пор, пока мы не получим заданное число успешных исходов. Скрипт будет только незначительно отличаться от первой задачи:
k = 0:1
n = allR = 0
while(allR != 5000){
s = c()
for(j in 1:4){
s = c(s,sample(k,size = 1,replace = T))
}
if(sum(s) == 4){
allR = allR + 1
}
n = n +1
}
n #всего циклов
allR/n*100
> n #всего циклов [1] 80718 > allR/n*100 [1] 6.194405 |