我理解set.seed()
做什么以及什么时候可以使用它,但我仍然有很多关于这个功能的问题。以下是一些:
set.seed()
,是否可以将set.seed()
“重置”为“更随机”的内容?这甚至是必要的吗?set.seed()
允许使用字母数字种子,就可以在random.org输入它们(确保您处于高级模式,并查看表单的“第3部分”)明白我的意思)?答案 0 :(得分:19)
只是为了好玩:
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对象,而不仅仅是字母数字字符串)
答案 1 :(得分: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)
答案 2 :(得分:7)
对于你的问题3,char2seed
包中有TeachingDemos
函数,它将采用字符串(alhpa数字)并将其转换为整数,默认使用它来设置新种子。这个想法是学生可以使用他们的名字(或名称的某些组合/子集)作为种子,这样每个学生都可以获得不同的数据集,但教师可以复制每个学生的数据集。
答案 3 :(得分:3)
要获得2的答案,请先查看帮助页?RNGkind
。
要查找正在使用的RNG类型:
RNGkind()
# [1] "Mersenne-Twister" "Inversion"
Mersenne Twister是默认设置。
从帮助页面:
'“Mersenne-Twister”:'来自Matsumoto和Nishimura(1998)。一个 扭曲的GFSR,周期为2 ^ 19937 - 1,等分布为 连续623个维度(整个期间)。该 'seed'是一组624维的32位整数加上a 该集合中的当前位置。
要查找当前使用的种子,您需要先调用随机数生成器。
runif(1, 0, 1)
# [1] 0.9834062
.Random.seed
# [Gives a 626 length vector]
拨打set.seed(some_integer)
后跟.Random.seed
,
如果你使用相同的some_integer
,它将始终给出相同的626长度向量。换句话说,626长度的向量仅由some_integer
决定,当然,假设有一个人正在使用Mersenne Twister。
此外,当然,将set.seed
运行到某个固定值将为您提供与其后跟随的随机数例程的相同值。这是实践中的主要用途,以提供可重复性。 E.g。
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中,但很容易理解。
答案 4 :(得分:1)
我遇到与问题1相同的问题。然后我想我可以简单地在循环中重置种子:
set.seed(123)
x<- rnorm(10,1,1)
set.seed(null)
这种方式在每个循环结束时,种子被删除了。它对我有用。