手动生成随机数


30

如何从给定的分布中手动生成一个随机数,例如从标准正态分布中生成10个实现?


10
您能解释为什么要这样做以及您受到哪些其他限制吗?
mdewey

2
您可以获得一个随机数表(用于发布随机数的rand)。
蝙蝠侠

4
@蝙蝠侠:是的,的确,随机数为10的兰德书在亚马逊上获得了655条评论。当然都是可以预见的。
西安

10
(令我惊讶的是,没有人对此发表过评论。)除非从本质上讲它不应该尝试使用自定义实现生成随机数。是的,很高兴知道如何做,这很可能是您在“ MC方法 ”类中看到的第一件事(那太好了!),但是在任何现实生活项目中都不要这样做。存在专用的随机数生成例程是有原因的,从头开始实施核心算法会浪费时间,产生漏洞并造成不良的现场感知工作。
usεr11852恢复单胞菌说,

2
@西安:是的,我同意这是一个安全的假设。如前所述,这只是一条警告,提醒人们在未意识到RNG设计是一项非常严肃的事情的情况下使用自己的RNG。用冯·诺伊曼的话说“任何考虑产生随机数的算术方法的人,当然都处于犯罪状态。”
usεr11852恢复单胞菌说,

Answers:


46

如果“手动”包括“机械”,那么您可以使用许多选项。为了模拟概率为一半的伯努利变量,我们可以抛硬币:尾部为,头部为1。为了模拟几何分布,我们可以计算在获得正面之前需要掷多少硬币。为了模拟二项式分布,我们可以抛硬币n次(或简单地抛n枚硬币)并计算正面数。在“梅花”或“豆芽机”或“高尔顿盒”是一个多动能的选择-为什么不设置一个付诸行动,看看自己?似乎没有“加权硬币”之类的东西01nn但是,如果我们希望将我们的伯努利变量或二项式变量的概率参数更改为以外的值,那么乔治·路易·勒克莱尔Georges-Louis Leclerc),孔德·德·布冯(Comte de Buffon)的针将允许我们这样做。为了模拟在离散均匀分布{ 1 2 3 4 5 6 }我们推出一个六面模。的角色扮演游戏的球迷会遇到了更奇特的骰子,例如四面体的骰子从均匀采样{ 1 2 3 4 }p=0.5{1,2,3,4,5,6}{1,2,3,4},而使用微调器或轮盘赌轮则可以走得更远。(图片来源

各种骰子

我们本来是疯了今天以这种方式产生的随机数,当它只是一个命令远离计算机控制台上-或者,如果我们有随机数可以适当表,去过一次书架的灰尘较多的角落?也许吧,尽管物理实验有令人愉悦的触感。但是对于在计算机时代之前(实际上是在广泛使用的大规模随机数表之前(在之后出现的更多数字之前))工作的人们来说,手动模拟随机变量具有更大的实际意义。布冯调查圣彼得堡悖论时—著名的掷硬币游戏,每次扔掉一个头后,玩家获胜的数量就会翻倍,玩家在第一个尾巴上会输,而且其预期收益是反直觉的,无穷大—他需要用模拟几何分布= 0.5。为此,似乎他雇了一个孩子扔硬币模拟了圣彼得堡游戏的2048场比赛,并记录了游戏结束前被扔了多少次。Stigler(1991)复制了这种模拟的几何分布:p=0.5

Tosses Frequency
1      1061
2      494
3      232
4      137
5      56
6      29
7      25
8      8
9      6

在同一篇文章中,他发表了对圣彼得堡悖论的实证研究,布冯还介绍了著名的“ 布冯针 ”。如果一个平面由平行线的距离分为条带开,并且长度的针d滴到其时,针穿过线之一的概率为2 dld2lπd

布冯针实验

布冯的针可,因此,可以用于模拟一个随机变量X二项式Ñ2XBernoulli(2lπd),我们可以通过改变我们的针或长度(也许更方便),在此我们排除了线的距离调整成功的概率。布冯针的另一种用法是寻找π的概率近似值的方法,在效率上是无效的。图片(credit)显示了17条火柴,其中11条横线。当将分格线之间的距离设置为等于火柴的长度时,如此处所示,交叉火柴的预期比例为2X二项式ñ2πdπ,因此,我们可以估算 π作为观察部分的倒数的两倍:在这里,我们得到 π =2172ππ^。在1901年马里奥拉扎里尼声称已经开3厘米执行使用2.5厘米针与线实验,和3408个后掷获得 π =355π^=217113.1。这是π的众所周知的有理数,精确到小数点后六位。 Badger(1994)提供了令人信服的证据,证明这是欺诈性的,尤其是要使用拉扎里尼(Lazzarini)的仪器对95位小数位数的准确性有95%的信心,必须扔掉耐心的134万亿针!当然,布冯的针头比作为估计π的方法,作为随机数生成器更有用。π^=355113ππ


到目前为止,我们的发电机是令人失望的离散。如果我们想模拟正态分布怎么办?一种选择是,以获得随机数,并使用它们,以形成良好的离散近似均匀分布,然后执行一些计算这些变换到随机正常偏离。微调器或轮盘赌轮可以给出从零到九的十进制数字;骰子可以产生二进制数字;如果我们的算术技能可以应付一个时髦的底子,那么即使是一套标准的骰子也可以。其他答案更详细地介绍了这种基于转换的方法。我将对此的任何进一步讨论推迟到最后。[01个]

到19世纪末,正态分布的效用已广为人知,因此统计学家热衷于模拟随机正态偏差。不用说,冗长的手计算只适合于首先建立模拟过程,否则不适合。一旦建立,随机数的生成就必须相对快速且容易。Stigler(1991)列出了这个时代的三位统计学家所采用的方法。所有人都在研究平滑技术:随机正态偏差很明显,例如,模拟需要平滑的测量误差。

杰出的美国统计学家Erastus Lyman De Forest对平滑生命表很感兴趣,并遇到了一个问题,需要模拟正态偏差的绝对值。为了证明这是一个持续的主题,De Forest实际上是从半正态分布的。此外,不是使用一个的标准偏差(在Ž Ñ 0 1 2我们用来调用“标准”),德福雷斯特想要的一个的“可能的错误”(平均偏差)。这是由“球形和实用天文学手册,第二卷”附录中的“ 错误概率”表中给出的形式。William Chauvenet采样的。从该表中,De Forest插值了一个半正态分布的分位数,从ZN(0,12 p = 0.995,他认为这是“等频率误差”。p=0.005p=0.995

De Forest等频率误差表

如果您想模拟正态分布,可以在De Forest之后将其打印出来并进行裁剪。德森林(1876)写道,错误“已被刻在100位大小相等的纸板上,这些纸板在一个盒子里摇晃起来,并被一张一张地抽出来”。

天文学家和气象学家乔治·霍华德·达尔文爵士(博物学家查尔斯的儿子)通过发展他所谓的“轮盘赌”来产生随机的正常偏差,对事物进行了另一种调整。达尔文(1877)描述了如何:

一张圆形的卡片径向放射状,所以标有的刻度是720x720π0xex2dx度远离固定半径。该卡的旋转方向是使其中心接近固定索引。然后将其旋转了许多次,并在停止旋转时读取了与索引相对的数字。[Darwin在脚注中添加:最好是在磁盘旋转得如此之快以至于看不见刻度时停止磁盘,而不是让磁盘沿其轨迹运行。]从刻度的性质来看,如此获得的数字将准确地出现。在实践中与观察错误的发生方式相同;但它们没有加减符号的前缀。然后通过再次掷一枚硬币一遍遍呼唤头和尾巴- ,迹象+偶然将 +分配给这一系列错误。+-

“索引”在此处应理解为“指针”或“指示器”(参见“食指”)。Stigler指出,达尔文与De Forest一样,在磁盘周围使用半正态累积分布。随后,使用硬币随机附加符号会使其呈现完整的正态分布。Stigler指出,目前尚不清楚刻度的精细程度,但是假定手动中止磁盘自旋的指示是“减少对磁盘某一部分的潜在偏见并加快操作过程”。

弗朗西斯·加尔顿爵士(Francis Galton)是查尔斯·达尔文(Charles Darwin)的半表哥,他的梅花形琴已经被提及。尽管这机械地模拟了二项式分布,但根据 De Moivre-Laplace定理,它与正态分布有惊人的相似之处(有时被用作该主题的教具),但当Galton想要来自正态分布的样本。与此答案顶部的非常规示例相比,高尔顿甚至更出色,他开发了正态分布的骰子-或更准确地说,是一组骰子,它们对正态分布产生极好的离散近似值,中值偏差为1。这些骰子的历史可追溯至1890年,保存在伦敦大学学院的高尔顿收藏中。

高尔顿普通骰子

在一个 自然》杂志 1890年的一篇文章中写道:

作为一种随机选择的工具,我发现没有什么比骰子更好。在每次连续抽奖之间彻底洗牌是最繁琐的事情,而混合和搅拌袋中标记球的方法仍然比较繁琐。甲teetotum或某种形式的轮盘优选这些,但骰子比所有更好。当他们摇晃并扔进篮子里时,它们彼此之间以及篮筐的肋骨之间产生了各种各样的伤害,以至于它们狂跌地翻滚着,一开始他们的位置并没有提供任何线索,即使它们经过单身好动摇和折腾。死者提供的机会比通常认为的要多。正如我将要说明的那样,存在24种相等的可能性,而不仅仅是6种,因为每个面都有四个可以利用的边缘。

+114

高尔顿普通骰子设计

Raazesh Sainudiin的数学统计实验实验室包括来自新西兰坎特伯雷大学的一个学生项目,该项目再现了高尔顿的骰子。该项目包括对骰子进行多次滚动(包括看起来令人放心的“正态”的经验CDF)的实证研究,以及对骰子得分的调整,以使它们遵循标准正态分布。使用高尔顿的原始分数,还有骰子分数实际遵循的离散正态分布图。

高尔顿骰子离散分布


总体上讲,如果您准备将“机械”范围扩展到电气上,请注意,兰德史诗级的“ 100,000个正常偏离的百万随机数”是基于一种轮盘赌轮的电子模拟。从技术报告(George W. Brown,最初于1949年6月)中,我们发现:

因此,兰德人在道格拉斯飞机公司工程人员的协助下,根据塞西尔·黑斯廷斯(Cecil Hastings)提出的建议的一种变型设计了一种电子轮盘。为了本演讲的目的,简要描述就足够了。一个随机频率脉冲源被一个恒定频率的脉冲选通,大约每秒一次,平均在一秒钟内提供大约100,000个脉冲。脉冲标准化电路将脉冲传递到5位二进制计数器,因此,原则上,机器就像一个轮盘赌轮,具有32个位置,平均每转大约旋转3000圈。使用了二进制到十进制的转换,丢弃了32个位置中的12个,并且将得到的随机数送入IBM打孔机,从而产生了随机数的打孔卡表。

χ2对奇数和偶数频率的测试表明,有些批次略有失衡。这在某些批次中要比其他批次的情况更糟,这表明“该机器自调试以来一个月内就处于运转状态……迹象表明,这台机器需要过度维护才能使其保持最佳状态”。但是,找到了解决这些问题的统计方法:

至此,我们拥有了原来的一百万个数字,20,000张具有50个数字的IBM卡至一张卡,统计分析揭示了很小但可感知的奇偶偏差。现在决定通过稍微玩轮盘赌来重新分配桌子,或至少更改它,以消除奇偶偏差。我们将每张卡中的数字逐位添加(模数为10)到前一张卡的相应数字上。然后,对派生的一百万个数字表进行各种标准测试,频率测试,串行测试,扑克测试等。这些一百万个数字具有健康的账单,并已被兰德公司用作现代随机数字表。

当然,有充分的理由相信添加过程会有所帮助。通常,底层机制是限制随机变量之和以矩形分布的单位间隔为模的限制方法,就像无限制的随机变量之和接近正态性一样。州际贸易委员会的霍顿和史密斯已使用此方法,从大批不良的非随机数中获取了一些好批的明显随机数。

[01个]ü[01个]FF-1个ü

Ziggurat为半正常

参考文献

  • Badger,L。(1994)。“的Lazzarini的Lucky逼近 ”。数学杂志。美国数学协会。67(2):83-91。

  • GH,达尔文(1877)。“ 关于可变数量的易失性度量以及对气象观测的处理。哲学杂志4(22),1-14

  • 德·森林(EL)(1876)。级数的插值与调整。Tuttle,Morehouse和Taylor,康涅狄格州纽黑文。

  • 加尔顿(F.)(1890)。“统计实验骰子”。自然42,13-14

  • Stigler,SM(1991)。“十九世纪的随机模拟”。统计科学6(1),89-97。


百万位数。它还包括他的著名语录,关于我们将其描述为随机数和伪随机数生成之间的区别:“任何考虑产生随机数的算术方法的人当然都处于犯罪状态。因为,正如多次指出的那样,不存在随机数之类的东西,只有产生随机数的方法了。 ,而严格的算术程序当然不是这种方法。”


5
您一定是在开玩笑...(但是,是的,这实际上是手动 +1)
nalzok

8
这需要多少工作!
理查德·哈迪

3
请注意,非标准骰子可能不公平,因此最好先对其进行测试,例如youtube.com/watch?v=VI3N4Qg-JZM
提姆

2
@RichardHardy矛盾的是,实际上,将所有这些东西记录在我的面前,并且至少暂时地留在我的记忆中,要比把它们全都放在我的头上要容易得多!
银鱼

2
无论如何,我都觉得令人印象深刻!
理查德·哈迪

44

如果可以使用非常精确的时钟,则可以提取当前时间的小数部分并将其转换为统一的形式,然后可以通过Box-Müller变换从中得出普通的模拟:

X=-2日志ü1个cos2πü2
(甚至两个 ÿ=-2日志ü1个2πü2 是另一个独立于 X)。

例如,在我的Linux操作系统上,我可以检查

$ date +%s.%N
1479733744.077762986
$ date +%s.%N
1479733980.615056616

因此设置

ü1个=.077762986 ü2=.615056616
X
> sqrt(-2*log(.077762986))*cos(2*pi*.615056616)
[1] -1.694815

附录:由于对数和余弦的计算可能被认为不够 手动,因此Box-Müller有一个变种,可以避免使用这些先验函数(请参见《蒙特卡洛统计方法》一书中的练习2.9 ):

Box-Muller的变体

现在,由于指数变量,人们可以反对这一版本。但是,由于冯·诺依曼(von Neumann),也存在一种非常聪明的方法来模拟那些变量,而无需调用先验函数,正如从Luc Devroye的非均匀随机变量复制的该算法中总结的那样

在此处输入图片说明

诚然,它只需要计算1 / e,但只需一次。

如果您无权使用此时钟,则可以用机械均匀发生器替换该均匀发生器,例如在具有大量单位平方的表面上掷飞镖01个2 或以单位间隔滚动球 01个具有足够的弹跳(如托马斯·贝斯(Thomas Bayes)的概念性台球实验),或者在具有单位宽度木板的木地板上扔火柴,并计算到最左边间隔的距离(如布冯的实验),或者进一步启动带有数字的轮盘将最低角度设为1,并将起始角度为1的结果角度变为均匀02π 画。

我绝对建议使用CLT近似正态性,因为(1)您仍然需要其他变量来提供平均值,因此不妨在Box-Müller算法中使用均一,以及(2)准确性会大大提高随着仿真次数的增加 尤其是如果使用离散的随机变量(例如骰子的结果),即使有六个以上的面孔,也是如此。引用托马斯等人。(2007),对高斯随机发生器的优缺点进行的调查:

中心极限定理当然是“近似”方法的一个示例-即使使用完美算术,对于有限K,输出也不是高斯。

这是一个演示该问题的快速实验:我生成了30次裸片结果平均值的100倍:

dies=apply(matrix(sample(1:6,30*100,rep=TRUE),ncol=30),1,mean)

然后将这些平均值归一化为均值零-方差一变量

stdies=(dies-3.5)/sqrt(35/12/30)

并查看了此样本的正常拟合度(或缺少):

qqnorm(stdies,col =“ gold2”,pch = 19); abline(a = 0,b = 1,col =“ steelblue”,lwd = 2,lty = 2)

首先,拟合度不高,尤其是在尾部,其次,很明显,图片证实了样本获取的值的数量非常有限。(在这个特定的实验中,和dies之间只有34个不同的值。)相比之下,如果我利用相同的 3000个管芯结果76/30122/30d一世 创建足够多的伪均匀数字

ü=一世=1个ķd一世-1个6一世
ķ=15 (请注意6 1> 10 11,因此我生成了11个以上的真正随机数字),然后应用上述Box-Müller变换将成对的制服变成成对的N(0,1)变量,
dies=matrix(apply(matrix(sample(0:5,15*200,rep=TRUE),nrow=15)/6^(1:15),2,sum),ncol=2) 
norma=sqrt(-2*log(dies[,1]))*c(cos(2*pi*dies[,2]),sin(2*pi*dies[,2]))

拟合度与大小为200的普通样本所期望的一样好(只需为真实的普通样本绘制另一个样本即可norma=rnorm(100)):

在此处输入图片说明

如Kolmogorov-Smirnov检验所示:

> ks.test(norma,pnorm)

        One-sample Kolmogorov-Smirnov test

data:  norma
D = 0.06439, p-value = 0.3783
alternative hypothesis: two-sided

3

这并不是完全随机的,但是应该足够接近,因为您似乎想要一个粗略的实验。

使用手机设置计时器。在10秒钟之后,将其停止(等待的时间越长,获得真正的“随机”结果的时间就越多,但是10秒钟就可以了)。取最后几个数字(例如,10.67秒将给您67)。将百分位表应用于正态分布。 在此示例中,您只需搜索0.67,即可找到数字。在这种情况下,您的价值约为0.45。这不是十分精确,但是可以为您提供可靠的估计。

如果您滚动到50以下,则只需执行100- [您的结果],然后使用表格即可。由于N(0,1)的对称性,您的结果将是相同的,带有负号。


3

让我们翻转无偏硬币 ñ次。从零开始,我们算+1个 如果有头 -1个如果有尾巴。后ñ 硬币翻转,我们将计数器除以 ñ。如果使用中心极限定理ñ 足够大,那么我们应该对归一化的高斯有一个“近似实现” ñ01个


为什么?让

Xķ:={+1个 如果 ķ硬币翻转是正面-1个 如果 ķ硬币翻转是尾巴

被iid Bernoulli随机变量与 PXķ=±1个=1个2。因此,

ËXķ=0VarXķ=1个

ÿ:=X1个+X2++Xñ。因此,

Ëÿ=0Varÿ=ñ

规范化

ž:=ÿñ

我们获得具有单位方差的随机变量

Ëž=0Varž=1个

1
正如我在回答中所讨论的那样,我担心CLT不能有效地利用硬币抛售中的随机性:最好将它们用作具有简单或双精度伪随机U(0,1)变量的二进制数字。
西安

@西安在发布我的信息之前,我已经阅读了您的答案,您对CLT的异议似乎是基于缓慢的融合。由于这是一个思想实验,因此掷硬币100亿次不会花费任何费用。这确实是一种手动过程,不需要计算机,无需计算对数,平方根或余弦。当然,可以使用计算尺,但这可能太过分了。
Rodrigo de Azevedo

1
:}}:100亿枚硬币翻转对我来说不是很手动 ...!
西安

手动=手动。手工计算对数和余弦也需要时间。
Rodrigo de Azevedo

0

值得注意的是,一旦您可以生成一个uniform(0,1),就可以通过将统一随机变量简单地插入到逆CDF中来生成可计算出逆cdf的任何随机变量。

那么,如何手动计算均一(0,1)?好吧,正如@Silverfish所提到的,传统的RPG玩家使用各种骰子。其中之一是十面模具。假设这是一个公平的模子,我们现在可以生成一个离散的均匀值(0,9)。

我们还可以使用这个Uniform(0,9)表示随机变量的一位数字。因此,如果我们使用两个骰子,我们将获得一个统一的随机变量,该变量可以取值0.010.020.991.00。有了三个骰子,我们就可以在0.0010.0020.9991.000

因此,我们可以通过精细网格化的离散均匀分布(具有几个10个侧面的骰子)对其进行近似,从而非常接近连续均匀(0,1)。然后可以将其插入逆CDF以产生感兴趣的随机变量。

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.