Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 该算法是否在单位圆盘上生成均匀分布(确定性RNG)?_Python_Algorithm - Fatal编程技术网

Python 该算法是否在单位圆盘上生成均匀分布(确定性RNG)?

Python 该算法是否在单位圆盘上生成均匀分布(确定性RNG)?,python,algorithm,Python,Algorithm,考虑以下算法: r = 2 while r >= 1: x = -1 + 2 * random.random() y = -1 + 2 * random.random() r = x * x + y * y 现在,如果我的研究是正确的,Python的随机模块使用系统时间作为初始种子(让我们考虑它是均匀分布的),然后在这里生成一个确定的数字序列,其中每一个调用随机的(随机)(或代码>)将导致0(包含)和1(排他性)之间的数目。 当算法终止时,点(x,y)应位于装置盘

考虑以下算法:

r = 2
while r >= 1:
    x = -1 + 2 * random.random()
    y = -1 + 2 * random.random()
    r = x * x + y * y
现在,如果我的研究是正确的,Python的随机模块使用系统时间作为初始种子(让我们考虑它是均匀分布的),然后在这里生成一个确定的数字序列,其中每一个调用<代码>随机的(随机)(或代码>)将导致0(包含)和1(排他性)之间的数目。 当算法终止时,点
(x,y)
应位于装置盘上的某个位置。由于浮点运算的限制,我们当然不能获得单位盘中的每个点,但是在我们可以获得的点中,这个算法会导致均匀分布吗

或者,等价地,该算法是否会以相同的概率返回可获得的每个点

我曾考虑将此发布到math.se,但由于该问题与python和算法密切相关,因此我认为StackOverflow更合适

现在我的直觉告诉我分布是不均匀的。考虑一个种子<代码> S1<代码>,其中最初生成的点不在单位盘内,然后算法将确定性地生成一个新的点<代码>(x,y)< /代码>(让我们假设这个点在单位圆内)并终止。现在我假设有一个种子
s2
,初始生成的点等于
s1
生成的点
(x,y)

显然,我可以通过使用至少两个不同的种子来生成
(x,y)
,其中一个实际上首先在单位圆外生成一个不同的点。现在,由于单位圆盘不包含
[-1,1)x[-1,1)
面积的一半,因此我认为并非每个点都由相同数量的种子生成,这意味着对于均匀分布的种子,返回的点不是均匀选择的

为了防止这成为一个问题,请考虑以上段落是我的研究的一部分,而不是这个问题的中心点。实际问题是用斜体印刷的问题。

该算法会以相同的概率返回每个可获得的点吗

从技术上说不是,但是长的RNG周期基本上抵消了这种影响,而且在从连续分布中采样时,我们并不关心特定点的确切概率。这种方法应该可以

您的分析是正确的,因为如果seed
s
导致拒绝,而使用
s'
的结果,则两个seed产生相同的输出。但是,在足够长的RNG周期内,许多seed自然会对应相同的输出,并且(假设基础RNG具有良好的统计特性)这种倍增效应将几乎均匀地分布在所有可能的输出上,因此即使是单个输出点上的分布也不会受到影响。Python的默认RNG是Mersenne Twister,其周期非常长

即使上述情况不成立,我们也不会在意。我们已经接受了一个基本的不一致性事实,即我们实际上甚至不能表示,更不用说生成,单位圆盘中的几乎所有点。如果我们可以生成的某些点的权重比其他点的权重更高,这其实并不重要,只要它不包含在内排除任何重要的统计偏差。如果左边的点的权重高于右边的点,我们会在意。如果一个在统计上无法与统一集区分的点的权重高于另一个在统计上无法与统一集区分的点的权重,这没什么大不了的

最后,如果seed
s
被拒绝,并且seed
s'
被替代使用,那么这两个seed将提供相同的输出,但我们实际上不会看到该输出两次,因为我们超越了这两个seed。如果我们以这种方式生成一系列点,而不需要对RNG进行其他干预,那么这基本上消除了你担心的电子效应

该算法会以相同的概率返回每个可获得的点吗

从技术上说不是,但是长的RNG周期基本上抵消了这种影响,而且在从连续分布中采样时,我们并不关心特定点的确切概率。这种方法应该可以

您的分析是正确的,因为如果seed
s
导致拒绝,而使用
s'
的结果,则两个seed产生相同的输出。但是,在足够长的RNG周期内,许多seed自然会对应相同的输出,并且(假设基础RNG具有良好的统计特性)这种倍增效应将几乎均匀地分布在所有可能的输出上,因此即使是单个输出点上的分布也不会受到影响。Python的默认RNG是Mersenne Twister,其周期非常长

即使上述情况不成立,我们也不会在意。我们已经接受了一个基本的不一致性事实,即我们实际上甚至不能表示,更不用说生成,单位圆盘中的几乎所有点。如果我们可以生成的某些点的权重比其他点的权重更高,这其实并不重要,只要它不包含在内排除任何重要的统计偏差。如果左边的点的权重高于右边的点,我们会在意。如果一个在统计上无法与统一集区分的点的权重高于另一个在统计上无法与统一集区分的点的权重,这没什么大不了的

最后,如果seed
s
被拒绝,并且seed
s'
被取代,那么这两个seed将给出相同的输出,但我们实际上不会看到该输出两次,因为我们超越了这两个seed。如果我们以这种方式生成一系列点,而没有其他人干预我们
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)