我使用的是R(3.6.1)的最新版本,但是当我使用使用随机数生成器的函数时,它们默认使用的是较旧的(即3.6.0之前的版本)RNG,该RNG使用舍入而不是拒绝进行采样。我不确定为什么会这样,感谢您的解决。
set.seed(1)
sample(20)
RNGkind()
R.version
Run Code Online (Sandbox Code Playgroud)
以下是我的跑步结果:
set.seed(1)
sample(20)
# 6 8 11 16 4 14 15 9 19 1 3 2 20 10 5 7 12 17 18 13
RNGkind()
# "Mersenne-Twister" "Inversion" "Rounding"
R.version
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status Patched
major 3
minor 6.1
year 2019
month 09
day 06
svn rev 77160
language R
version.string R version 3.6.1 Patched (2019-09-06 r77160)
nickname Action of the Toes
Run Code Online (Sandbox Code Playgroud)
基于新闻和链接的讨论,我期望的输出RNGkind()看起来如下:
# "Mersenne-Twister" "Inversion" "Rejection"
Run Code Online (Sandbox Code Playgroud)
我误会了新闻吗?
正如@JanvanderLaan 在评论中所建议的那样,一个可能的问题可能源于.RData启动时正在加载的文件。例如,如果R安装了以前的版本并且每次都使用它,则getwd()启动会话时的初始工作目录将包含一个.RData文件和一个.Rhistory文件,如果有人保存了该会话。documents如果使用 Rstudio,通常这是Windows 上的文件夹,大多数人都会用自己的方式清除旧的或不寻常的文件。
按照评论中的建议,getwd()在新R会话中转到目录输出,我找到了一个.RData文件,关闭了现有R会话而不保存当前会话,然后重新打开一个新R会话。它似乎正确解决了问题,如下所示。因此,生成随机数的方法似乎确实保存在.Rdata文件内的会话之间。
RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rejection"
Run Code Online (Sandbox Code Playgroud)
我们实际上可以很容易地在新的 R 会话中说明这一点,无论设置了哪个随机数生成器。假设R之前曾打开并保存过一个会话R-3.6.1,下面的代码说明了这个问题
#Assuming that the R session has just opened
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rounding"
>RNGversion("3.6.1")
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rejection"
>load(".RData", verbose = TRUE)
Loading objects:
.Random.seed
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rounding"
Run Code Online (Sandbox Code Playgroud)
可以看出,它存储了.Random.seed,但是没有显示的是,在加载之前的环境时,还导入了随机数生成器的类型。执行
file.remove(".RData")
q("no")
Run Code Online (Sandbox Code Playgroud)
因此应该解决未来会话的问题,假设当前会话中的工作目录没有改变。