繁体   English   中英

关于R中的set.seed()的问题

[英]Questions about set.seed() in R

我理解set.seed()做什么以及什么时候可以使用它,但我仍然有很多关于函数的问题。 以下是一些:

  1. 如果您在会话中先前调用了set.seed() ,是否可以将set.seed() “重置”为“更随机”的内容? 这甚至是必要的吗?
  2. 是否可以查看R当前使用的种子?
  3. 有没有办法让set.seed()允许字母数字种子,可以在random.org中输入它们的方式 (确保你处于高级模式,并看到表单的“第3部分”,看看我的意思) ?

纯娱乐:

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

如果你将种子设置为类似你时间时代的最终数字,这是可能的,但实际上没有必要。 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,在TeachingDemos包中有char2seed函数,它将采用字符串(alhpa数字)并将其转换为整数,默认情况下使用它来设置新种子。 这个想法是学生可以使用他们的名字(或名称的某些组合/子集)作为种子,这样每个学生都可以获得不同的数据集,但教师可以复制每个学生的数据集。

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

要找到使用中的RNG类型:

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

Mersenne Twister是默认设置。

从帮助页面:

'“Mersenne-Twister”:'来自Matsumoto和Nishimura(1998)。 扭曲的GFSR,周期为2 ^ 19937 - 1,等分布在623个连续维度(整个期间)。 '种子'是一组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 some_integer ,626长度的向量仅由some_integer决定, 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中,但很容易遵循。

我有与问题1相同的问题。然后我想我可以简单地在循环中重置种子:

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

这种方式在每个循环结束时,种子刚被删除。 它对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM