随机数生成器中的种子究竟是什么?


21

我尝试了一些常用的Google搜索等方法,但是我发现的大多数答案都有些模棱两可或特定于语言/库,例如Python或C ++ stdlib.h等。我正在寻找与语言无关的数学答案,而不是库的细节。

例如,许多人说种子是随机数生成器的起点,而同一种子总是产生相同的随机数。这是什么意思?这是否意味着输出数量是特定种子的确定性函数,并且随机性来自种子的值?但是如果是这样的话,那么,通过提供种子,我们(程序员)难道不是创造随机性而不是让机器去做吗?

另外,在这种情况下起点是什么意思?这是说映射域的元素的一种非严格方法吗?还是我出了点问题? ˚F XÿxXf:XY


7
我不具备写答案的资格,但是您可能会在Merced Twister上找到有关Wikipedia的文章,特别是有关初始化部分。简而言之,像Mersenne Twister这样的伪随机数生成器最终将重复其输出。对于MT而言,周期有长度2^19937 − 1。种子是生成器启动的极长序列的起点。是的,这是确定性的。
IonicSolutions

1
伪随机数生成器是无限重复的固定数字列表。它从哪里开始? 你可以说。
ub

2
@whuber我实际上认为您的评论将是一个很好的答案。
David Z

Answers:


22

大多数伪随机数生成器(PRNG)都基于涉及某种递归方法的算法,该算法从称为“种子”的输入确定的基值开始。大多数统计软件(R,Python,Stata等)中的默认PRNG是Mersenne Twister算法 MT19937,该算法Matsumoto和Nishimura(1998)中进行了阐述。这是一个复杂的算法,因此,如果您想详细了解它的工作原理,那么最好阅读该论文。在此特定算法中,存在度的递归关系,并且您的输入种子是向量。该算法使用线性递归关系生成:X 0X 1x n 1nx0,x1,...,xn1

xn+k=f(xk,xk+1,xk+m,r,A),

其中和和是可以在算法中指定为参数的对象。由于种子给出了向量的初始集合(以及算法的其他固定参数),因此算法生成的一系列伪随机数是固定的。如果更改种子,则将更改初始向量,这将更改算法生成的伪随机数。当然,这就是种子的功能。ř 1mnrA

现在,重要的是要注意,这只是使用MT19937算法的一个示例。统计软件中可以使用许多PRNG,并且每种PRNG涉及不同的递归方法,因此种子在每种中都意味着不同的东西(在技术上)。您可以R本文档中找到PRNG的库,其中列出了可用的算法以及描述这些算法的论文。

种子的目的是允许用户“锁定”伪随机数生成器,以进行可复制的分析。一些分析师喜欢使用真正的随机数生成器(TRNG)设置种子,该生成器使用硬件输入来生成初始种子数,然后将其报告为锁定数。如果种子是由原始用户设置和报告的,则审核员可以重复分析并获得与原始用户相同的伪随机数序列。如果未设置种子,则算法通常将使用某种默认种子(例如,从系统时钟),并且通常将无法复制随机化。


+1。如果未明确提供种子,最好添加(通常)发生的情况。
变形虫说恢复莫妮卡

1
@amoeba:我的答案的第4段对此进行了简要讨论。
BruceET '18

1
尽管这回答了问题的基础知识,但并没有触及为什么我们在仿真中需要这个事实。产生真正的随机性非常困难-并且当您拥有时,您将无法重现原始答案!输入所有问题的PNRG...。
Paul Palmpje

@amoeba:根据要求,我添加了一个额外的段落来充实此内容。
恢复莫妮卡

1
谢谢。“默认种子”听起来有点像种子的默认值相同;我的意思是通常是从系统时钟中获取种子。我想知道这一点。
变形虫说恢复莫妮卡

16

首先,当今计算机生成的“随机数” 没有真正的随机性。所有伪随机生成器都使用确定性方法。(可能,量子计算机会改变这一点。)

艰巨的任务是设计算法,以产生无法与真正随机来源的数据区分开的输出。

正确的做法是,在一长串伪随机数中,您可以从一个特定的已知起点开始设置种子。对于用R,Python等实现的生成器,列表非常长。足够长的时间,以至于即使最大的可行模拟项目也不会超出生成器的“周期”,因此值开始重新循环。

在许多普通的应用程序中,人们不要设置种子。然后会自动选择一个不可预测的种子(例如,从操作系统时钟上的微秒)。通用的伪随机发生器已经过一系列测试,其中很大一部分问题已被证明很难用较早的不令人满意的发生器来模拟。

通常,发生器的输出包含一些值,这些值实际上从实际值上不能与上的均匀分布真正随机选择的数字区分开然后对这些伪随机数进行操作,以匹配从其他分布(例如二项式,泊松,正态,指数等)中随机采样的样本。(0,1).

生成器的一项测试是查看其在“观测”中模拟为连续对是否 实际上看起来像它们是随机填充单位平方。(下面做两次。)外观稍有大理石花纹是固有变化的结果。得到一块看起来完全一致的灰色的地块将是非常可疑的。[在某些分辨率下,可能会有规则的莫尔条纹;请向上或向下更改放大倍率,以消除出现这种虚假效果的情况。]Unif(0,1)

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

在此处输入图片说明

设置种子有时很有用。一些此类用途如下:

  1. 在编程和调试时,具有可预测的输出很方便。如此多的程序员set.seed在程序的开头放置了一条语句,直到完成编写和调试为止。

  2. 在讲授模拟时。如果我想向学生展示我可以使用sampleR中的函数来模拟一个公平的骰子卷,那么我可以作弊,运行许多模拟并选择最接近目标理论值的模拟。但这会给模拟的真实工作带来不切实际的印象。

    如果我一开始就设置了种子,那么每次模拟都会得到相同的结果。学生可以校对我的程序副本,以确保它能达到预期的效果。然后,他们可以使用自己的种子或通过让程序选择自己的开始位置来运行自己的仿真。

    例如,两个骰子时获得总10的概率为通过一百万次2骰子实验,我应该获得大约2或3个位置精度。95%的模拟误差裕量约为2

    3/36=1/12=0.08333333.
    2(1/12)(11/12)/106=0.00055.
    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
    
  3. 共享涉及模拟的统计分析时。 如今,许多统计分析都涉及某种模拟,例如置换测试或Gibbs采样器。通过显示种子,可以使阅读分析的人员准确复制结果,如果他们愿意的话。

  4. 在撰写涉及随机的学术文章时。学术文章通常会经过多轮同行评审。绘图可以使用例如随机抖动点来减少过度绘图。如果需要根据审阅者的意见对分析进行轻微更改,则最好是在审阅之间不改变不相关的特定抖动,这可能会使特别挑剔的审阅者感到不安,因此您可以在抖动之前设置一个种子。


1
非常好,+ 1。我赞成增加第四点。
S. Kolassa-恢复莫妮卡

那么,您是说一个伪随机数发生器基本上存储一个随机数的周期序列(均匀分布在[0,1]中),而种子只是该序列的索引吗?那么这是否意味着生成的随机数是种子的确定性函数?
德拉

9
你不需要量子计算机使用量子现象有一个随机数发生器(en.wikipedia.org/wiki/Hardware_random_number_generator
Guiroux

1
@Della。您基本上有正确的想法。但是请理解,实际上,“期间”必须非常大。(无论您的仿真项目有多大,您都不想重复它。)例如,IonicSolutions在Q之后评论说Mersenne Twilster生成器的周期为比我可以轻易看到的要大一些。//如果知道种子,则可以从那里生成伪随机序列。//生成器已用于加密消息。但是用于加密的安全生成器的标准不同于用于概率模拟的生成器的标准。2199371,
BruceET

@Guiroux。我试图提到的重新量子计算机的可能性是使真正的随机数生成器与当今的伪随机生成器一样快。在1950年代,“真实”随机数源用于实验设计中的随机化和(缓慢,有限的)概率模拟。也许看到百万随机数字
BruceET '18

0

TL; DR;

通常,种子可以使您重现随机数序列。从这个意义上讲,它们不是真正的随机数,而是“伪随机数”,因此是PNR生成器(PNRG)。这些是现实生活中的真正帮助!

更详细一点:

实际上,以计算机语言实现的所有“随机”数字生成器都是伪随机数生成器。这是因为给定一个起始值(===>种子),它们将始终提供相同的伪随机结果序列。一个好的生成器将产生一个序列,该序列在统计学上无法与真正的随机序列区分开(抛出真实的骰子,真实的硬币等)。

在许多模拟情况下,您都希望获得真正的“随机”体验。但是,您还希望能够重现结果。为什么?好吧,至少监管者对此特有的东西感兴趣。

有很多东西可以潜入。人们甚至对“最佳”随机种子进行分析。在我看来,这使他们的模型无效,因为他们无法处理“真正的”随机行为-或PRNG不适合其实现。在大多数情况下,他们只是做的模拟不够多-但是需要时间。

现在想象一个“真正的” RNG。可以基于机器中的一种随机性来实现这一点。如果仅获取随机种子(例如现在的时间),则可以创建某种随机的起点,但是序列的随机性仍然取决于确定下一个数字的算法。在大多数情况下,这比起点更重要,因为结果的分布决定了实际的“结果”。如果您的序列应该是真正随机的,您将如何实现呢?可以说计算机的时钟节拍是确定性的,否则可能会显示很多自相关。所以,你可以做什么?到目前为止,最好的选择是实施可靠的PNRG。

量子计算?我不确定是否可以解决该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.