您的位置:首页 > 编程语言 > Python开发

Python随机生成均匀分布在单位圆内的点

2016-11-17 00:42 621 查看
Python有一随机函数可以产生[0,1)区间内的随机数,但是如果我们想生成随机分布在单位圆上的,那么我们可以首先生成随机分布在单位圆边上的点,然后随机调整每个点距离原点的距离,但是我们发现这个距离不是均匀分布于[0,1]的,而是与扇形的面积相关的

我们使用另外的随机函数生成从[0,1)的随机数r,我们发现r<s0的概率为s0,显而易见,如果r为0,那么对应的距离应该为0,如果是1,对应的距离自然也应该是1,假设我们产生了m个随机数,那么小于s0的随机数应该为s0*m左右,而且这些应该对应于扇形面积的s0倍处即图2的小扇形区域,落在这一区域的点应该为s0*m,此时扇形边长为s0^0.5,因此s0对应的距离应该为s0^0.5,因此我们得到的映射函数为y=x^0.5(图1)



图 1



图 2

因此我们对于每个顶点的边长便是产生随机数的算术平方根的大小

附代码如下:

# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

if __name__=='__main__':
samples_num = 800
t = np.random.random(size=samples_num) * 2 * np.pi - np.pi
x = np.cos(t)
y = np.sin(t)
i_set = np.arange(0,samples_num,1)
for i in i_set:
len = np.sqrt(np.random.random())
x[i] = x[i] * len
y[i] = y[i] * len
plt.figure(figsize=(10,10.1),dpi=125)
plt.plot(x,y,'ro')
_t = np.arange(0,7,0.1)
_x = np.cos(_t)
_y = np.sin(_t)
plt.plot(_x,_y,'g-')
plt.xlim(-1.1,1.1)
plt.ylim(-1.1,1.1)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Random Scatter')
plt.grid(True)
plt.savefig('imag.png')
plt.show()




图 3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息