首先,今天计算机生成的“随机数”没有真正的随机性。所有伪随机生成器都使用确定性方法。(可能,量子计算机会改变这一点。)
艰巨的任务是设计生成的输出无法有意义地与来自真正随机源的数据区分开来的算法。
你是对的,设置种子会让你从一长串伪随机数中的一个特定已知起点开始。对于用 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))
设置种子有时很有用。一些这样的用途如下:
在编程和调试时,有可预测的输出是很方便的。如此多的程序员set.seed
在编写和调试完成之前将语句放在程序的开头。
在教授模拟时。如果我想向学生展示我可以使用 R 中的函数模拟公平骰子的滚动sample
,我可以作弊,运行许多模拟,然后选择最接近目标理论值的一个。但这会给仿真的真正工作方式带来不切实际的印象。
如果我在开始时设置种子,模拟每次都会得到相同的结果。学生可以校对他们的我的程序副本,以确保它给出预期的结果。然后他们可以使用自己的种子或让程序选择自己的起点来运行自己的模拟。
例如,掷两个公平骰子时得到总数为 10 的概率是通过一百万次 2 骰子实验,我应该得到大约 2 位或 3 位的准确度。95% 的模拟误差幅度约为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.
共享涉及模拟的统计分析时。
如今,许多统计分析都涉及一些模拟,例如置换检验或吉布斯采样器。通过显示种子,您可以使阅读分析的人能够准确地复制结果,如果他们愿意的话。
在撰写涉及随机化的学术文章时。学术文章通常要经过多轮同行评审。绘图可以使用例如随机抖动的点来减少过度绘图。如果需要根据审稿人的评论对分析进行轻微更改,最好在审稿轮次之间不改变特定的无关抖动,这可能会让特别挑剔的审稿人感到不安,因此您在抖动之前设置种子。