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
因此我们对于每个顶点的边长便是产生随机数的算术平方根的大小
附代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# -*- 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
总结
以上就是本文关于Python随机生成均匀分布在单位圆内的点代码示例的全部内容,希望对大家有所帮助。有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/u011396359/article/details/53193615