首页 > 解决方案 > 何时以及为什么不对某些函数及其输入采样随机数生成器?

问题描述

在我的上一个问题中,我了解到随机数生成器在函数中p = 1或函数中不会被采样。是否有任何其他功能应该知道在给定某些输入的情况下没有对随机数生成器进行采样?我问的原因是,尽管使用了固定种子,但在与这些输出变量无关的参数发生变化之后,某些变量的模拟输出在模拟之间不是恒定的。p = 0rbinom()

正在使用的 RI 版本:

> R.version
               _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          6.1                         
year           2019                        
month          07                          
day            05                          
svn rev        76782                       
language       R                           
version.string R version 3.6.1 (2019-07-05)
nickname       Action of the Toes    

标签: rrandomsimulationrandom-seed

解决方案


您可能关心的 R 的伪随机数生成方法的一个问题是,R 使用的伪随机数生成器 (PRNG) 是全局的,但可以重新播种(使用 set.seed)以实现可重复的“随机性”。

据我所知,用于rnormrunifrpois等的算法没有记录在一个级别,可以让您了解每种方法在 R 的全局 PRNG 中的进步程度以及在什么情况下。要了解有关每种方法的确切算法的更多信息,请查看 R 的源代码。然而,全局 PRNG 可以重新播种以获得可重复的“随机性”这一事实在某种意义上意味着,在不影响向后兼容性的情况下,不能轻易更改 PRNG 的算法。另请参阅与您的关注相关的答案:Creating a PRNG engine for <random> in C++11 that match PRNG results in R

即便如此,对 PRNG 使用全局状态还是有问题的,尤其是当全局种子可以在 PRNG 用户背后发生变化时。(另请参阅NumPy 的 RNG 策略。)对于 R 来说,更好的方法是使用轻量级 PRNG 对象,这些对象是单独播种的,然后传递这些对象(这样我们就可以拥有,例如rnorm(rng, mean, stdev)。)不同类型的 PRNG 对象可以实现不同的 PRNG 算法和/或不同的随机变量生成算法(即不同版本的rnorm,runif等)。

以下是解决您上一个问题中潜在问题的一些方法:

  • 考虑一下“常见随机数”技术,您可以在此站点上搜索该技术。
  • 替换对 , 等的调用rnormrpois使用调用runif生成统一随机变量的自定义方法,然后通过反转将该变量转换为所需的分布(请参阅“逆变换采样”)。
  • 替换对 , 等的调用rnormrpois使用调用runif生成统一随机变量的自定义方法,然后将该变量用作本地(非全局)伪随机生成器的种子,该生成器又用于从所需的生成变量分配。JAX 中使用了类似的东西,尤其是它的 PRNGKey 类。

请注意,最后两个建议将适用于您的目的,假设runif无论情况如何,始终绘制固定数量的伪随机位。


推荐阅读