#r #montecarlo
#r #Монтекарло
Вопрос:
Я пишу моделирование методом Монте-Карло, чтобы проверить, сколько раз y не было непосредственно рядом с другим y. Я вызвал в воображении вектор из 40 x и 10 y, расположенных в случайном положении в векторе. Моя цель — вычислить вероятности отсутствия каких-либо смежных y в векторе. Вот что я попробовал:
nrep = 100000
count = 0
for (i in 1:nrep) {
x = sample(c(rep('x', 40), c(rep('y', 10))))
if (x[i]!=x[i 1] amp;amp; x[i 1]!=x[i 2]) count = count 1
}
print(count/nrep)
Результатом является очень небольшое число, которое, похоже, не имеет смысла для меня.
Ответ №1:
if
Часть неверна. Мы можем использовать head
/ tail
для проверки наличия последовательных элементов и посмотреть, есть ли any
два последовательных 'y'
s в одной итерации.
nrep = 100000
count = 0
set.seed(2020)
for (i in 1:nrep) {
x = sample(rep(c('x', 'y'), c(40, 10)))
if(any(head(x, -1) == 'y' amp; tail(x, -1) == 'y')) count = count 1
}
count/nrep
#[1] 0.891
Комментарии:
1. Привет, @Ronak, я не уверен, что функции head и tail работают здесь так, как задумано; исправьте меня по мере необходимости. Я думаю, что способ, которым вы написали этот код, проверяет групповой шаблон на соответствие другой группе (т. Е. Начало вектора против конец). Я хочу проверить наличие любых несмежных y и увеличить количество на 1.
2. Нет .. это не проверка начала и конца. Он проверяет наличие последовательных элементов, значение
count
которых будет увеличиваться, если два y будут где-либо вместе. Попробуйте выполнить это по отдельности без цикла.x = sample(rep(c('x', 'y'), c(40, 10)))
Проверьтеx
, а затем запуститеany(head(x, -1) == 'y' amp; tail(x, -1) == 'y')
. Сравните выходныеhead(1:10, -1)
данные vstail(1:10, -1)
3. @Yoko КСТАТИ, приведенное выше дает вероятность возникновения двух соседних y. Если вы хотите противоположного, вы можете изменить условие в
if
, просто сделайте1 - count/nrep
выше.4. да, я понимаю… просто пытаюсь понять, что происходит на этапах head и tail
5. No..in количество итераций будет увеличиваться только на 1, если условие будет выполнено. Значение, даже если у вас есть
yyyyxyyyyxy
количество, будет увеличено только на 1.