考虑以下算法:
r = 2
while r >= 1:
x = -1 + 2 * random.random()
y = -1 + 2 * random.random()
r = x * x + y * y
现在,如果我的研究是正确的,python的随机模块使用系统时间作为初始种子(让我们认为这是统一分布的),然后使用{{3}生成确定的数字序列}每次调用random.random()
都会产生0(含)和1(不包含)之间的数字。
当算法终止时,点(x,y)
应位于单位光盘上的某个位置。由于浮点运算的局限性,我们当然不能获得单位圆盘内的每一个点,但是我们可以得到的,这个算法会导致均匀分布吗?
或者,等效地,这个算法会以相同的概率返回每个可获得的点吗?
我考虑将此发布到math.se,但由于问题与python和算法密切相关,我认为StackOverflow更合适。
现在我的直觉告诉我分布不均匀。考虑最初生成的点不在单位盘内的种子s1
,然后算法将确定地生成新点(x,y)
(让我们假设这一点在单位圆内)并终止。现在我假设有一个种子s2
,最初生成的点等于(x,y)
生成的点s1
。
显然,我可以通过使用至少2个不同的种子来生成(x,y)
,其中一个种子实际上首先在单位圆外产生了一个不同的点。现在因为单位圆盘不包含[-1,1) x [-1,1)
面积的一半,我会得出结论,并非每个点都是由相同数量的种子生成的,这意味着对于均匀分布的种子,返回的点不是均匀选择的
为防止这种情况成为mersenne twister algorithm,请将上一段视为我研究的一部分,而不是此问题的中心点。实际问题是用斜体打印的问题。
答案 0 :(得分:3)
这个算法会以相同的概率返回每个可获得的点吗?
技术上没有,但是长RNG期基本上抵消了这种影响,并且特定点的确切概率并不是我们在连续分布采样时所关心的。这种拒绝抽样应该没问题。
您的分析是正确的,只要种子s
导致拒绝并且使用来自s'
的结果,那么两个种子都会产生相同的输出。然而,对于足够长的RNG周期,许多种子将自然地对应于相同的输出,并且(假设基础RNG具有良好的统计特性),这种倍增效应将在所有可能的输出上几乎均匀地分布,因此即使是在个体上的分布也是如此。输出点不会受到损害。 Python的默认RNG是Mersenne Twister,其周期很长。
即使上述情况不成立,我们也不会关心。我们已经接受了一个基本的不均匀性,因为我们实际上甚至无法表示单位光盘中的几乎所有点,更不用说生成它们了。如果我们能生成的某些个体点的权重比其他点高,那么这并不重要,只要它没有引入任何重要的统计偏差。如果左边的点比右边的点重要,我们会关心。如果一个统计上无法区分的统一集中的点的权重高于不同统计上无法区分的统一集中的点,那么这并不是什么大问题。
最后,如果种子s
被拒绝并且种子s'
被用于其位置,那两个种子会产生相同的输出,但我们实际上并没有看到输出两次,因为我们超过了两个种子。如果我们以这种方式生成一系列点数,而没有RNG的其他干预用途,这大多消除了您担心的影响。
答案 1 :(得分:1)
我的观点可能过于简单,但您基本上在(-1,-1)和(1,1)之间的边界框内生成点,并删除单位磁盘外的每个点。你不会随便洗牌,你不会移动任何一点,你只需将形状切割成另一个形状。
单位圆盘内的点将与正方形中的点一样均匀分布。它并不意味着它们是均匀分布的。只是你的分析不应受while r >= 1:
的影响。
以下是您的算法中的1E6点:
答案 2 :(得分:1)
您的问题的答案是否是。该算法将 not 在单位圆内提供均匀分布。 原因是你的一些样品会离开圆圈。为了获得数学上正确的可预测的均匀分布,你必须使用极坐标,对于这样的坐标,你的代码样本应该这样做:
def get_random_point_in_unit_circle():
theta = random.random() * ( 2 * math.pi )
r = math.sqrt(random.random())
x = r * math.cos( theta )
y = r * math.sin( theta )
return (x, y)
编辑:
所以我的回答并不完全正确,谢谢你指出了这一点。就您的功能提供均匀分布的概率而言,因为在该区域内获取样本的概率是恒定的。拒绝解决方案的缺点是不可预测性。
答案 3 :(得分:1)
彼此之上有几个近似值。
浮点数仅仅是实数的近似值。
Python随机甚至不提供正确的舍入随机实数;假设统一源,它在0,1 / 2 ^ 53,2 / 2 ^ 53,......,(2 ^ 53-1)/ 2 ^ 53上给出均匀分布。
源仅大致均匀,因为MT状态不能为零。
即使在给定真随机种子的每个特定样本中来源均匀随机,足够的后续样本也不是独立的,因为伪随机生成器的工作原理。
鉴于种子是有限的,不可能生成具有许多结果的均匀分布,这些结果不会划分种子空间的大小。几乎可以肯定的是你的分发。