我知道set.seed()
做什么以及何时使用它,但我仍有许多关于该函数的问题。以下是几个问题:
- 如果您在会话中较早地调用了
set.seed()
,是否有可能将其“重置”为“更随机”的内容? 这是必要的吗? - 是否有办法查看R当前正在使用的种子(seed)?
- 是否有一种方法可以使
set.seed()
允许输入字母数字混合种子,就像人们可以在random.org网站输入的那样(确保您在高级模式下,并查看表单的“第3部分”)?
我知道set.seed()
做什么以及何时使用它,但我仍有许多关于该函数的问题。以下是几个问题:
set.seed()
,是否有可能将其“重置”为“更随机”的内容? 这是必要的吗?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对象,而不仅仅是字母数字字符串)
village.names
的对象创建种子,我可能会做更多类似这样的事情:hexval <- paste0("0x", sapply(village.names, digest, "crc32")); intval <- type.convert(hexval) %% .Machine$integer.max
以生成要传递给另一个函数的种子列表。感谢迄今为止提供的所有建议! - A5C1D2H2I1M1N2O1R2T1t <- as.numeric(Sys.time())
seed <- 1e8 * (t - floor(t))
set.seed(seed); print(seed)
set.seed()
的作用是为了使结果可复现等方面。我关注的是,假设我执行set.seed(123); a = sample(300, 30); b = sample(300, 30)
,但我只想让a
“可复现”——我希望每次运行时得到的b
结果不同。对我来说,这意味着在执行a
和b
的代码之间,我需要以某种方式重置种子。 - A5C1D2H2I1M1N2O1R2T1as.numeric(Sys.time())-> t; set.seed((t - floor(t)) * 1e8 -> seed); print(seed)
这样的代码通常可以有效地实现大多数目的。 - Fhnuzoagrm(.Random.seed, envir=globalenv())
相比,Fhnuzoag的解决方案除了能够查看新的随机种子外,还有什么优势吗?在我有限的R使用中,我没有使用过globalenv()
,所以我不太清楚我在做什么。但我可以理解我在使用Fhnuzoag的解决方案。我之所以问这个问题,是因为.Random.seed
的帮助文件指出它不应该被用户更改,但在其示例中建议使用rm(.Random.seed)
。 - A5C1D2H2I1M1N2O1R2T1针对您的第三个问题,在TeachingDemos
包中有一个char2seed
函数,可以将字符字符串(字母数字)转换为整数,并默认使用它来设置新种子。这个想法是让学生可以使用他们的名字(或某些组合/子集的名字)作为种子,以便每个学生都能得到不同的数据集,但老师可以重现每个学生的数据集。
sapply
而不是抓取strsplit
结果的第一个元素)以与向量一起使用,或者可以使用sapply
、mapply
或Vectorize
与char2seed
一起使用,从向量输入中获得向量结果。 - Greg Snow针对问题2的答案,请首先查看帮助页面?RNGkind
。
找到当前使用的随机数生成器种类:
RNGkind()
# [1] "Mersenne-Twister" "Inversion"
runif(1, 0, 1)
# [1] 0.9834062
.Random.seed
# [Gives a 626 length vector]
set.seed(一些整数)
,然后是.Random.seed
,如果您使用相同的some_integer
,将总是给出相同的626长度向量。换句话说,在使用Mersenne Twister的情况下,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
我和问题1一样遇到了同样的问题。然后我想,我可以通过在循环中重置种子来解决:
set.seed(123)
x<- rnorm(10,1,1)
set.seed(null)
rm(.Random.seed, envir=globalenv())
,这在 ?.Random.seed
的帮助文件中提到...我在提出这个问题后才找到它 :-) - A5C1D2H2I1M1N2O1R2T1
?.Random.seed
(虽然有点复杂,但也许会有其他人回答)。?RNG
可以得到大部分答案。 - Andrie