2014-02-11 2 views
9

Нечетная вещь случается, когда в R, когда я делаю set.seed (0) и set.seed (1);R: странное поведение set.seed()

set.seed(0) 
sample(1:100,size=10,replace=TRUE) 
#### [1] 90 27 38 58 91 21 90 95 67 63 


set.seed(1) 
sample(1:100,size=10,replace=TRUE) 
#### [1] 27 38 58 91 21 90 95 67 63 7 

При изменении семени от 0 до 1, я получаю точно такую ​​же последовательность, но сдвинутую на 1 ячейку!

Обратите внимание, что если у меня есть set.seed (2), я получаю то, что кажется совершенно другим (случайным?) Вектором.

set.seed(2) 
sample(1:100,size=10,replace=TRUE) 
#### [1] 19 71 58 17 95 95 13 84 47 55 

Кто-нибудь знает, что здесь происходит?

+0

Посмотрите на '? RNG' – Thomas

+0

Кроме того, 'seed' требует целое число'> is.integer (0) [1] FALSE' – rawr

+4

@rawr - вы попали туда: '0' является двойным, следовательно' is.integer (0) 'FALSE, но' is.integer (0L) 'TRUE. ** Но ** 'set.seed' будет принудительно вводить float в целое число. Так что это не проблема. –

ответ

15

Это относится к реализации R RGG Mersenne-Twister.

set.seed() принимает входящие в комплекте семян и шифрует его (в функции C RNG_Init):

for(j = 0; j < 50; j++) 
    seed = (69069 * seed + 1); 

Это скремблированный номер (seed) затем вскарабкался 625 раз, чтобы заполнить исходное состояние для Mersenne-Twister:

for(j = 0; j < RNG_Table[kind].n_seed; j++) { 
    seed = (69069 * seed + 1); 
    RNG_Table[kind].i_seed[j] = seed; 
} 

Мы можем исследовать исходное состояние для ГСЧ с помощью .Random.seed:

set.seed(0) 
x <- .Random.seed 

set.seed(1) 
y <- .Random.seed 

table(x %in% y) 

Из таблицы видно, что существует много перекрытий. Сравните это seed = 3:

set.seed(3) 
z <- .Random.seed 

table(z %in% x) 
table(z %in% y) 

Возвращаясь к случаю 0 и 1, если мы рассмотрим само государство (не обращая внимания на первые два элемента вектора, которые не относятся к тому, что мы рассматриваем), вы можно увидеть, что состояние компенсируется одним:

x[3:10] 
# 1280795612 -169270483 -442010614 -603558397 -222347416 1489374793 865871222 
# 1734802815 

y[3:10] 
# -169270483 -442010614 -603558397 -222347416 1489374793 865871222 1734802815 
# 98005428 

Поскольку значения, выбранные sample() основаны на эти цифры, вы получите странное поведение.

+0

Спасибо! Это определенно добавляет некоторую ясность в эту проблему. Мне придется больше смотреть на этот код, чтобы узнать, как/почему 0 и 1 выходят так же. – bigO6377

+0

Добро пожаловать. Имейте в виду, что максимальное целое число равно 2^32 - 1 и число будет переполняться до отрицательного. –

+2

Обратите внимание, что если вы 'set.seed (69070)', тогда вы получите дополнительный сдвиг на 1 (имеет смысл с учетом 1-го цикла цикла выше). Мы могли бы расширить цикл, чтобы найти следующий сдвиг на 1 и т. Д. Комбинация 0,1 просто интересна рядом друг с другом, не видя петли, маловероятно, чтобы кто-то случайно сравнивал 1 и 69070. –

1

Как вы можете видеть из другого ответа, семена 0 и 1 приводят к почти аналогичным начальным состояниям. Кроме того, Вихрь Мерсенна ПСЧ имеет severe limitation - «почти аналогичные начальные состояния потребуется длительное время, чтобы расходиться»

Поэтому целесообразно использовать альтернативы, как WELL ПСЧ (которые могут быть найдены в пакете randtoolbox)

Смежные вопросы