Пусть
ll <- c(0.2, 0.2, 0.15, 0.15)
ul <- c(0.5, 0.5, 0.4, 0.3)
, где ll
и ul
соответствуют нижнему и верхнему пределам для каждой из случайных величин.Затем
x <- runif(length(ll), 0, ul - ll)
- это вектор равномерного случайного отбора из интервалов [0,0.3], [0,0.3], [0,0.25] и [0,0.15].Причина этого в том, что наш конечный вектор равен
if(sum(x) > 1 - sum(ll)) {
ll + x / sum(x) * (1 - sum(ll))
} else {
ll + x + (ul - ll - x) / sum(ul - ll - x) * (1 - sum(x) - sum(ll))
}
# [1] 0.3112532 0.2927185 0.2347163 0.1613119
Итак, если sum(x) > 1 - sum(ll)
, это означает, что x
слишком велико.В этом случае мы перенормируем его, делая его меньше.Таким образом, все ограничения выполняются.В противном случае x
слишком мало.В этом случае мы собираемся добавить часть ul - ll - x
.Теперь ключ в том, что обязательно
sum(ul - ll - x) > (1 - sum(x) - sum(ll))
, что означает, что ul - ll - x
не увеличивается, и, следовательно, снова все ограничения выполняются.
Плотности ядра соответствующих элементовследующим образом
![enter image description here](https://i.stack.imgur.com/qQIdQ.png)