Подтвердить что ты не робот

Вопросы о set.seed() в R

Я понимаю, что делает set.seed() и когда я могу его использовать, но у меня все еще есть много вопросов о функции. Вот несколько:

  • Возможно ли "reset" set.seed() что-то "более случайное", если вы назовете set.seed() ранее на вашем сеансе? Это даже необходимо?
  • Можно ли просмотреть семя, которое R использует в настоящее время?
  • Есть ли способ сделать set.seed() разрешить буквенно-цифровые семена, как можно ввести их в random.org (убедитесь, что вы в расширенном режиме и см. "Часть 3" формы, чтобы увидеть, что я имею в виду)?
4b9b3361

Ответ 1

Просто для удовольствия:

set.seed.alpha <- function(x) {
  require("digest")
  hexval <- paste0("0x",digest(x,"crc32"))
  intval <- type.convert(hexval) %% .Machine$integer.max
  set.seed(intval)
}

Итак, вы можете сделать:

set.seed.alpha("hello world")

(фактически x может быть любым объектом R, а не только буквенно-цифровой строкой)

Ответ 2

Возможно, если вы установите семя на что-то вроде последних цифр вашей временной эпохи, но это действительно не нужно. Предполагаемое использование PRNG заключается в том, что вы устанавливаете семя один раз в начале сеанса и используете из него последовательные сгенерированные вариации. Делайте что-то по-другому, и вы не можете наслаждаться различными хорошими теоретическими и эмпирическими свойствами R RNG.

Но я не уверен, что вы действительно понимаете цель set.seed. Это не значит, что вы получите "более случайные" цифры. Если вы делаете какое-то приложение, для которого R PRNG недостаточно (например, если вам нужна криптографическая случайность), вы можете также генерировать все ваши случайные числа с помощью некоторого альтернативного метода и использовать их напрямую. Реальная цель set.seed заключается в обеспечении воспроизводимости результатов с использованием RNG. Если вы начнете один и тот же анализ с использованием той же последовательности генерации случайных чисел и установите семя на одно и то же значение, вы всегда получите тот же результат. Это полезно при отладке, а для других - для просмотра ваших результатов.

Чтобы использовать эпоху, сделайте что-то вроде

t <- as.numeric(Sys.time())
seed <- 1e8 * (t - floor(t))
set.seed(seed); print(seed)

Ответ 3

Для вашего вопроса 3 есть функция char2seed в пакете TeachingDemos, которая примет строку символов (alhpa numeric) и преобразует ее в целое число и по умолчанию использует это, чтобы установить новое семя. Идея заключалась в том, что ученики могли использовать свое имя (или некоторую комбинацию/подмножество имен) в качестве семени, поэтому каждый ученик получает другой набор данных, но учитель может воспроизвести каждый набор данных учеников.

Ответ 4

Для ответа на 2 сначала просмотрите страницу справки ?RNGkind.

Чтобы найти тип используемого RNG:

RNGkind()
# [1] "Mersenne-Twister" "Inversion" 

По умолчанию используется Mersenne Twister.

На странице справки:

' "Мерсенн-Твистер": от Мацумото и Нишимура (1998).           скрученный GFSR с периодом 2 ^ 19937 - 1 и равнораспределение в           623 последовательных размера (за весь период).           'Seed - это 624-мерный набор из 32-битных целых чисел плюс           текущее положение в этом наборе.

Чтобы найти текущее семя, вы должны сначала вызвать генератор случайных чисел.

runif(1, 0, 1)                                                                                                                                                  
# [1] 0.9834062                                                                                                                                                      
.Random.seed
# [Gives a 626 length vector]

Вызов set.seed(some_integer), за которым следует .Random.seed, всегда будет давать тот же вектор длины 626, если вы используете тот же some_integer. Иначе говоря, вектор длины 626 определяется исключительно some_integer, если использовать, конечно, Mersenne Twister.

Кроме того, конечно, запуск set.seed до некоторого фиксированного значения даст вам те же значения для вызовов подпрограмм случайных чисел, следующих за ним. Это основное использование для этого на практике, чтобы обеспечить воспроизводимость. Например.

set.seed(1)
runif(5, 0, 1)
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
rnorm(1, 0, 1)
# [1] 1.272429
set.seed(1)
runif(5, 0, 1)
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
rnorm(1, 0, 1)
# [1] 1.272429

Весь код генератора базовых чисел в R находится в файле src/main/RNG.c в исходном коде.

Он находится в C, но довольно легко следовать.

Ответ 5

У меня та же проблема, что и в вопросе 1. Затем я рисую, что могу просто reset семя в цикле:

set.seed(123)
x<- rnorm(10,1,1)
set.seed(null)

Таким образом, в конце каждого цикла семя просто удалялось. Это сработало для меня.