21

我了解set.seed()它的作用以及何时可以使用它,但我仍然对该功能有很多疑问。这里有几个:

  1. 如果您在会话中早些时候打电话,是否可以“重置”set.seed()为“更随机”的东西?set.seed()这甚至有必要吗?
  2. 是否可以查看 R 当前使用的种子?
  3. 有没有办法set.seed()允许字母数字种子,可以在random.org输入它们的方式(确保您处于高级模式,并查看表格的“第 3 部分”以了解我的意思)?
4

5 回答 5

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

于 2012-06-06T11:29:57.237 回答
15

这是可能的,如果你将种子设置为你的时间纪元的最后数字,但这真的没有必要。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)
于 2012-06-06T08:47:19.710 回答
7

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

于 2012-06-06T16:28:09.957 回答
3

有关 2 的答案,请先查看帮助页面?RNGkind

要查找正在使用的 RNG 类型:

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

Mersenne Twister 是默认设置。

从帮助页面:

'“Mersenne-Twister”:'来自松本和西村(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,当然,假设使用的是 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 语言编写的,但很容易理解。

于 2013-05-31T21:05:50.640 回答
1

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

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

这样,在每个循环结束时,种子就被删除了。它对我有用。

于 2016-02-17T20:44:14.533 回答