约set.seed问题()中的R(Questions about set.seed() in R)

2019-06-25 05:37发布

我明白set.seed()不和时,我可能会使用它,但我仍然有关于函数的许多问题。 这里有几个:

  1. 是否有可能“复位” set.seed()的东西“更随意”如果你调用set.seed()早前在会话? 是,即使有必要吗?
  2. 是否可以查看r是当前使用的种子?
  3. 有没有一种方法,使set.seed()允许字母数字的种子,可以在进入他们的方式random.org (确保你是在先进的模式,并参阅“第3部分”的形式来看看我的意思) ?

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



Answer 2:

这是可能的,如果你的种子设置为像您的时间划时代的最终数字,但它确实没有必要。 该用途的PRNG的是,你在会议开始时设置的种子一次,并使用从这个连续产生的变元。 做不同的事情,和你没有得到享受的各种良好的理论和实证性质将R的RNG有。

但我不知道你真正了解set.seed的目的。 这是不是真的有你得到“更随机”的数字。 如果你正在做一些类型的应用程序对于其将R PRNG是不够的(例如,如果您需要加密的随机性),你不妨用一些替代的方法生成所有随机数和直接使用它们。 set.seed的真正目的是使用随机数发生器结果产生的重现性。 如果您在使用随机数生成的相同顺序启动相同的分析,并设置种子为相同的值,你总是会得到相同的结果。 这是在调试有帮助,并为他人查看您的结果。

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

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


Answer 3:

对于你的问题3存在char2seed在功能TeachingDemos包将采取的字符串(alhpa数字),并将其转换为整数,并默认使用该设置新的种子。 当时的想法是,学生可以使用他们的姓名(或名称的某种组合/子集)作为种子使每个学生得到不同的数据集,但老师可以再现每个学生的数据集。



Answer 4:

对于一个答案2,首先看到的帮助页面?RNGkind

要了解所使用的那种RNG的:

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

梅森倍捻机是默认的。

从帮助页面:

“‘梅森捻丝机’:”从松本和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 。 换种方式,626长度的矢量由书确定some_integer ,给定的一个是使用梅森难题,当然。

此外,当然,跑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 /主/ RNG.c在源代码中。

这是C,但还算容易。



Answer 5:

我有同样的问题,因为在问题1,然后我想我可以简单地重置种子在循环方式:

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

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



文章来源: Questions about set.seed() in R
标签: r random