Суббота, 04.04.2026, 21:47Приветствуем вас Гость | RSS
Решение задач в среде R
Главная | Кидаем монету 4 раза | Регистрация | Вход
» Меню сайта

» R практикум

» R кодинг

» Rmatem

» Опрос
Сколько вам лет?
Всего ответов: 9

» Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Подбрасывание монеты 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

 

» Вход на сайт

» Поиск

» Работа с файлами

» Вся графика

» Гистогра́мма

» Теория вероятности

» Сравнение групп

» Дисперс анализ

» Блог

» Календарь
«  Апрель 2026  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
27282930

» Архив записей


Copyright MyCorp © 2026
uCoz