首先,当今计算机生成的“随机数” 没有真正的随机性。所有伪随机生成器都使用确定性方法。(可能,量子计算机会改变这一点。)
艰巨的任务是设计算法,以产生无法与真正随机来源的数据区分开的输出。
正确的做法是,在一长串伪随机数中,您可以从一个特定的已知起点开始设置种子。对于用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
在程序的开头放置了一条语句,直到完成编写和调试为止。
在讲授模拟时。如果我想向学生展示我可以使用sample
R中的函数来模拟一个公平的骰子卷,那么我可以作弊,运行许多模拟并选择最接近目标理论值的模拟。但这会给模拟的真实工作带来不切实际的印象。
如果我一开始就设置了种子,那么每次模拟都会得到相同的结果。学生可以校对我的程序副本,以确保它能达到预期的效果。然后,他们可以使用自己的种子或通过让程序选择自己的开始位置来运行自己的仿真。
例如,两个骰子时获得总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.
共享涉及模拟的统计分析时。
如今,许多统计分析都涉及某种模拟,例如置换测试或Gibbs采样器。通过显示种子,可以使阅读分析的人员准确复制结果,如果他们愿意的话。
在撰写涉及随机的学术文章时。学术文章通常会经过多轮同行评审。绘图可以使用例如随机抖动点来减少过度绘图。如果需要根据审阅者的意见对分析进行轻微更改,则最好是在审阅之间不改变不相关的特定抖动,这可能会使特别挑剔的审阅者感到不安,因此您可以在抖动之前设置一个种子。
2^19937 − 1
。种子是生成器启动的极长序列的起点。是的,这是确定性的。