2012-06-06 274 views
17

我明白set.seed()会做什么以及何时可以使用它,但我仍然对函数有很多疑问。这里有几个:关于set.seed()的问题R

  1. 是否有可能“复位” set.seed()的东西“更随机”,如果你刚才在您的会议称为set.seed()?这甚至是必要的吗?
  2. 是否可以查看R当前正在使用的种子?
  3. 有没有办法使set.seed()允许字母数字种子,你可以在random.org输入它们的方式(确保你处于高级模式,并查看表格的“第3部分”以了解我的意思)?
+4

1.我不认为这是必要的; 2.''.Random.seed'(它比这更复杂一点,但也许别人会回答) –

+2

阅读'?RNG'获得大部分答案 – Andrie

回答

18

只是为了好玩:

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对象,而不仅仅是一个字母数字字符串)

+0

不错”只是为了好玩“答案。实际上,我想创建一个在某个函数中使用的种子向量。因此,假设我基于名为'village.names'的对象创建种子,我可能会做更类似于:'hexval < - paste0(“0x”,sapply(village.names,digest,“crc32”)) ; intval < - type.convert(hexval)%% .Machine $ integer.max'来生成一个种子列表以传递给另一个函数。感谢您的所有建议! – A5C1D2H2I1M1N2O1R2T1

12

如果将种子设置为类似于时间历元的最后一位数的种子,但它确实没有必要。 PRNGs的预期用途是在会话开始时设置一次种子,并使用连续生成的变量。以不同的方式做事,你不会享受R RNG具有的各种优秀的理论和经验性质。

但我不确定你真的了解set.seed的目的。这不是真的有你得到'更随机'的数字。如果您正在做某种应用程序(R PRNG不足)(例如,如果您需要加密随机性),则可以通过某种替代方法生成所有随机数并直接使用它们。 set.seed的真正目的是为了在使用RNG的结果中产生可重复性。如果使用相同的随机数生成序列开始相同的分析,并将种子设置为相同的值,则您将始终得到相同的结果。这对调试很有帮助,而其他人则可以查看您的结果。

要使用划时代的时间,这样做

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

我明白'set.seed()在可重复性等方面。我看到的是,我说'set.seed(123); a =样品(300,30); b = sample(300,30)''但我只对使a'“可重现性感兴趣” - 我希望每次都有不同的'b'结果。对我来说,这意味着在运行'a'的行和'b'的行之间,我需要以某种方式重置种子。 – A5C1D2H2I1M1N2O1R2T1

+6

哦,好的。那么,尝试像'as.numeric(Sys.time()) - > t; set.seed((t - floor(t))* 1e8 - > seed);打印(种子)'将对大多数目的有效。 – Fhnuzoag

+2

Fhnuzoag应该是一个答案,而不是评论,国际海事组织。 –

6

对于你的问题3,在TeachingDemos包中有char2seed函数,它将采用一个字符串(alhpa numeric)并将其转换为一个整数,默认情况下用它来设置一个新的种子。这个想法是,学生可以使用他们的名字(或某些组合/名字子集)作为种子,这样每个学生都可以获得不同的数据集,但是教师可以复制每个学生的数据集。

+0

感谢您的建议。我没有在我的原始问题中指定它,但我需要根据字符串的向量实际创建一个种子向量。看起来你的功能无法做到这一点;我对么?顺便说一下,很棒的包装。 – A5C1D2H2I1M1N2O1R2T1

+1

当前版本将只生成1个种子,而不是一个矢量(通过上述目的设计),有一个硬编码的[[1]]。但是可以修改它(使用sapply而不是抓取strsplit的结果的第一个元素)来处理向量,或者简单使用'sapply','mapply'或'Vectorize'可以与'char2seed一起使用'从矢量输入中获得矢量结果。 –

2

对于2的答案,首先请参阅帮助页?RNGkind

要找到那种RNG的使用:

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

的梅森难题是默认的。

从帮助页面:

“ “梅森捻线机”:”从松本和西村(1998年)。A 扭曲的GFSR期间2^19937 - 1和 连续维度(在整个期间)的等分。 “种子”是该组中的32位整数的624维集合加上 当前位置。

要找到正在使用的当前种子,您需要先调用随机数生成器。

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中,但很容易遵循。

0

我有同样的问题,因为在问题1,然后我想我可以通过循环简单复位种子:

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

这样,在每个循环的种子刚刚删除的结束。它为我工作。

+0

感谢您的回答。更常见/正统的方法是'rm(.Random.seed,envir = globalenv())',它在'?.Random.seed'的帮助文件中提到过......我只是在这个问题后才得出的:-) – A5C1D2H2I1M1N2O1R2T1

+0

'set.seed(null)'没有为我工作。是否有其他方法来重置种子值或使其无效。 – mockash