为什么像runif()
R 中的随机数生成器每次都不会生成相同的结果?
例如:
X <- runif(100)
X
每次都产生不同的输出。
每次产生不同输出的原因是什么?
它在后台执行了哪些功能来执行此操作?
为什么像runif()
R 中的随机数生成器每次都不会生成相同的结果?
例如:
X <- runif(100)
X
每次都产生不同的输出。
每次产生不同输出的原因是什么?
它在后台执行了哪些功能来执行此操作?
从本质上讲,这不仅仅是一个 R 问题。它更普遍地与随机数生成有关。
“随机”数字在统计的许多部分都非常重要。我们需要我们生成的随机值具有某些属性,并且(通常)大量的精力用于构建随机数生成器并检查它们的属性。
这个想法是我们想要获得一系列值,这些值可以很好地代表实际随机数。随机数生成的常用主力是均匀分布(我们从中构造其他随机数,如高斯随机数)。
因此(最典型地)一种数值算法用于构造一个整数序列,每个整数都根据先前整数的某些功能。然后将这些整数缩放到介于 0 和 1 之间(通常是)。
例如,许多人只是在前一个上工作:
...其中是整数,被缩放到单位间隔内,并且是一些通常复杂但通常快速的函数,它对其参数中的位进行操作以产生一组新的位那(希望)似乎与任何先前的值无关(如果我们以各种方式看待它们,甚至非常仔细——即使它们确实是相关的,因为它们就是这样产生的)。这些必须仔细构建,以确保序列有一个非常长的周期,并且它的值是真正统一的,并且不以我们可能真正关心的任何方式顺序依赖(以及许多其他通常被认为是重要的)。
它们需要您提供的起始(“种子”)整数()(某些算法可能需要多个种子)。如果您再次使用相同的种子,您将获得相同的序列(这对于能够重现结果很方便)。但有些时候,你只需要一些随机数,你并不关心种子是什么,只要起点与你之前使用的批次不同即可。
因此,如果您不提供种子,许多包裹可以为您制作一个。一些软件包会查看内部数字时钟的最后几位数字(通常以某种方式进行操作)。一些(包括 R)存储由随机数生成器生成的用作下一个种子的最后一个值(上面的整数,更一般地,术语“状态”用于涵盖涉及多个数字的情况)如果你不提供一个。
请参阅?runif
R 中的内容,您会注意到它解释了随机种子的存在,并附有指向帮助的链接,该帮助?.Random.seed
解释了 R 中可用的大量随机数生成器(您甚至可以提供自己的)。相同的帮助页面解释说,如果您之前没有使用过随机数生成或设置种子,则从时钟开始,种子会被存储,然后存储之前的值(这样您获得的下一个随机数将是如果您上次生成了一个值,您将获得相同的值——它会记住“你在哪里”)。
R 中的函数runif
(就像其他包中的许多其他随机数生成例程通常可以做类似的事情一样)知道随机数种子的保存位置。它会不断更新该值。所以它可以在不显式传递种子的情况下运行,但它仍然使用一个;如果你没有给它,它只会使用它最后保存的那个。
至于为什么它每次都给出不同的输出(如果你不告诉它给出相同的序列):它这样做是因为每次相同的值通常会适得其反——它不会具有重复的属性随机抽样会有,这使得它对于我们使用随机数生成器的 putpose 不是很有用。
您必须设置随机种子才能每次获得相同的结果。使用?set.seed这样做。考虑:
> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087
您可能有兴趣阅读以下内容: 使用 set.seed 函数的原因。