r - 何时以及为什么不对某些函数及其输入采样随机数生成器?
问题描述
在我的上一个问题中,我了解到随机数生成器在函数中p = 1
或函数中不会被采样。是否有任何其他功能应该知道在给定某些输入的情况下没有对随机数生成器进行采样?我问的原因是,尽管使用了固定种子,但在与这些输出变量无关的参数发生变化之后,某些变量的模拟输出在模拟之间不是恒定的。p = 0
rbinom()
正在使用的 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
解决方案
您可能关心的 R 的伪随机数生成方法的一个问题是,R 使用的伪随机数生成器 (PRNG) 是全局的,但可以重新播种(使用 set.seed)以实现可重复的“随机性”。
据我所知,用于rnorm
、runif
、rpois
等的算法没有记录在一个级别,可以让您了解每种方法在 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
等)。
以下是解决您上一个问题中潜在问题的一些方法:
- 考虑一下“常见随机数”技术,您可以在此站点上搜索该技术。
- 替换对 , 等的调用
rnorm
。rpois
使用调用runif
生成统一随机变量的自定义方法,然后通过反转将该变量转换为所需的分布(请参阅“逆变换采样”)。 - 替换对 , 等的调用
rnorm
。rpois
使用调用runif
生成统一随机变量的自定义方法,然后将该变量用作本地(非全局)伪随机生成器的种子,该生成器又用于从所需的生成变量分配。JAX 中使用了类似的东西,尤其是它的 PRNGKey 类。
请注意,最后两个建议将适用于您的目的,假设runif
无论情况如何,始终绘制固定数量的伪随机位。
推荐阅读
- ruby-on-rails - 尝试加入两个模型,不确定应该是什么适当的活动记录关联
- css - 从样式表中检测并删除旧的浏览器 CSS hack
- wpf - 当窗口垂直调整为更小的尺寸时,避免 WPF 状态栏完全折叠
- serializable - 非序列化类型的就地编译
- sql - SQL-如何根据另一列中的值将项目组合在一起?
- excel-formula - 使用带有条件语句的索引和匹配函数返回非唯一值
- graphql - 覆盖 GraphQL 联合/接口类型的“根”对象值
- ruby-on-rails - actioncable 无法与生产设计一起使用
- excel - 如何将参数值从 sub 传递到 excel VBA shell 命令以进行远程执行?
- c++ - 在 C++ 中分配大小为 10000 10000 3 的 3 维向量