Иногда я хочу написать рандомизированную функцию, которая всегда возвращает тот же вывод для конкретного ввода. Я всегда выполнял это, установив случайное семя в верхней части функции, а затем продолжая. Рассмотрим две функции, определенные таким образом:
sample.12 <- function(size) {
set.seed(144)
sample(1:2, size, replace=TRUE)
}
rand.prod <- function(x) {
set.seed(144)
runif(length(x)) * x
}
sample.12
возвращает вектор заданного размера, случайным образом выбранный из набора {1, 2}
и rand.prod
, умножает каждый элемент заданного вектора на случайное значение, равномерно выбранное из [0, 1]
. Обычно я ожидал бы, что x <- sample.12(10000) ; rand.prod(x)
будет иметь "ступенчатое" распределение с pdf 3/4 в диапазоне [0, 1]
и 1/4 в диапазоне [1, 2]
, но из-за моего неудачного выбора одинаковых случайных семян выше я вижу другой результат:
x <- sample.12(10000)
hist(rand.prod(x))
Я могу исправить эту проблему в этом случае, изменив случайное семя в одной из функций на какое-то другое значение. Например, при set.seed(10000)
в rand.prod
я получаю ожидаемое распределение:
Ранее на SO это решение использования разных семян было принято в качестве наилучшего подхода для генерации независимых потоков случайных чисел. Однако я считаю, что решение является неудовлетворительным, потому что потоки с разными семенами могут быть связаны друг с другом (возможно, даже сильно связаны друг с другом); на самом деле они могут даже давать идентичные потоки в соответствии с ?set.seed
:
Нет никакой гарантии, что разные значения семян будут засеять RNG по-разному, хотя любые исключения будут крайне редкими.
Есть ли способ реализовать пару рандомизированных функций из R, что:
- Всегда возвращайте один и тот же вывод для определенного ввода, а
- Обеспечить независимость между их источниками случайности более чем просто с использованием разных случайных семян?