Python随机生成器不是那么随机?

时间:2015-08-09 19:09:08

标签: python python-3.x

是否考虑了python随机生成器" good"?如同,它是否很好地模拟随机性?我制作了一个小程序,模拟一个人从(0,0)开始,并在东,西,北,南随机步骤。当您运行具有越来越多步骤的模拟时,您会期望人的最终位置越来越接近原点。但是,当我增加模拟中的步数时,最终位置越来越远离原点。我使用的程序在这里:

import random

def walk():
    north = 0
    east = 0
    for i in range(10000):
        direction = random.randint(0, 100)
    if direction <= 25:
        north = north + 1
    elif direction > 25 and direction <= 50:
        north = north - 1
    elif direction > 50 and direction <= 75:
        east = east + 1
    else:
        east = east - 1
return north, east



def main():
    for i in range(500):
        north, east = walk()
        print("NE : ", north, east)


main()        

3 个答案:

答案 0 :(得分:7)

  

当您使用越来越多的步骤进行模拟时,您会期望此人的最终位置越来越接近原点。

这根本不是真的。想象一下你从(0,0)开始。向东走一步,带你到(1,0)。现在,为了更接近原点,你需要向西迈进一步。向任何其他方向迈出一步将使您远离原点。所以,你有1/4的机会更接近原点,有3/4的机会远离原点。无论你身在何处,都是如此;通常情况下,一步将使您远离原点。因此,您的模拟表现如预期;你去的时间越长,距离你的起源越远。

要知道为什么这是真的;考虑一个单向步行,你可以向左或向右走。如果你采取十步,预期值是左右50:50; 5左和右5,带你回到原点。当然,你最终可能会在60:40或70:30结束,离你原点一两步之遥。毕竟,这是一个小样本。如果你采取1000步,你最终可能会得到520左右到480左右,非常接近50:50的比例。如果你采取10000步,你将更接近50:50的比例,可能是5050:4950。

然而,有一些非常重要的事情需要注意;当您的样本量变大时,从左到右的步骤的比例接近50:50,但左右步骤之间的绝对差异得到较大的。在最后一种情况下,你有一个50.5:49.5的比例,但是你距离原点几步<50> ,相比之下,如果你有一个60,则离原点只有一步之遥:40比率,十步。

答案 1 :(得分:2)

它不是python,它是这一行:

        direction = random.randint(0, 100)

以上将生成值0 <= N <= 100,这是101个可能的值。你已经在你的发电机中引入了偏差,并且考虑到偏差,数字越大,你实际上就越偏离原点。

使用无偏的生成器,您的平均值为零。

答案 2 :(得分:0)

无论上述答案都是好的和正确的,用Python实现的随机生成器是Mersenne Twister,它已知不会通过着名应用程序TestU01中最难的2个测试,并且也被认为是有点大的评价。 你可以尝试这个库:PyRandLib。参见:

这个库包含许多同类最佳的伪随机数生成器,其行为与Python“内置”库随机行为完全相同。 只需在Python目录的“Lib / site-packages /”子目录中解压缩或解压缩下载的存档。然后,享受: - )