繁体   English   中英

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

[英]Python random generator not so random?

python随机生成器被认为是“好”吗? 如上,它是否很好地模拟了随机性? 我编写了一个小程序,该程序模拟了一个从(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()        

当您使用越来越多的步数运行模拟时,您会期望人的最终位置越来越靠近原点。

这根本是不正确的。 假设您从(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的比率和10步的情况下,与原点的距离为50步。

这不是python,而是这一行:

        direction = random.randint(0, 100)

上面将生成一个值0 <= N <= 100,这是101个可能的值。 您已经将偏见引入了生成器,并赋予了偏见,实际上,您将偏离原点越来越远。

对于无偏发电机,您的平均值为零。

不管上面的答案是正确的还是正确的,用Python实现的随机生成器都是Mersenne Twister,众所周知,它没有通过著名应用程序TestU01的最困难的测试中的2个,而且还有些长评估。 您可以尝试使用以下库:PyRandLib。 看到:

该库包含许多同类最佳的伪随机数生成器,而其功能与Python“内置”库random完全相同。 只需在Python目录的'Lib / site-packages /'子目录中解压缩下载的档案即可。 然后,享受:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM