1) Код в вопросе имеет следующие проблемы:
нам нужна новая случайная переменная на каждой итерации, но она генерирует новые случайные переменные, только еслиif
условие ЛОЖЬ
x1
многократно перезаписано, а не расширенно
, хотя while
может использоваться * Кажется 1018 *лучше, поскольку тест в конце подходит лучше, чем тест в начале
Мы можем исправить это следующим образом:
x1 <- c()
repeat {
w <- rexp(1)
if (w > 0.5) {
x1 <- c(x1, w)
if (length(x1) == 100) break
}
}
1a) Вариант будет следующим.Обратите внимание, что if
с условием FALSE оценивается как NULL, если отсутствует нога else
, поэтому, если условие имеет значение FALSE в строке, помеченной ##, то ничего не объединяется с x1
.
x1 <- c()
repeat {
w <- rexp(1)
x1 <- c(x1, if (w > 0.5) w) ##
if (length(x1) == 100) break
}
2) Альтернативно, это генерирует 200 экспоненциальных случайных величин, сохраняя только те, которые больше, чем 0,5.Если генерируется менее 100, повторите.В конце он берет первые 100 из последней сгенерированной партии.Мы выбрали 200 достаточно большим, чтобы на большинстве прогонов потребовалась только одна итерация цикла.
repeat {
r <- rexp(200)
r <- r[r > 0.5]
if (length(r) >= 100) break
}
r <- head(r, 100)
Альтернатива (2) на самом деле быстрее, чем (1) или (1а), потому что она большевысоко векторизацияИ это несмотря на то, что оно выбрасывает больше экспоненциальных случайных величин, чем другие решения.