R 3.6.1的随机数生成器

Dav*_*ave 16 r

我使用的是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)

我误会了新闻吗?

Oli*_*ver 7

正如@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)

因此应该解决未来会话的问题,假设当前会话中的工作目录没有改变。