生成均匀分布在单位圆内的点是一道常见的算法题,下面是示例代码和详细攻略。
生成均匀分布在单位圆内的点
要生成均匀分布在单位圆内的点,可以使用下面的方法。
-
先生成均匀分布在正方形区域内的点。
-
然后筛选出在单位圆内的点。
步骤1可以通过调用Python自带的random
模块实现,以平面直角坐标系为例,代码如下:
import random
def generate_points(n):
"""生成n个均匀分布在正方形区域内的点"""
points = []
for i in range(n):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
points.append((x, y))
return points
上述代码中,random.uniform(a, b)
函数用于生成a到b之间的均匀分布的随机数。通过调用该函数生成点的x、y坐标,将其作为元组(x, y)
加入到列表中,最终返回生成的点列表。
步骤2可以通过判断点是否在单位圆内实现,圆心为坐标系原点,半径为1。如果点$(x,y)$在单位圆内,则满足$x^2+y^2\le1$,代码如下:
def filter_points(points):
"""筛选出在单位圆内的点"""
filtered_points = []
for x, y in points:
if x ** 2 + y ** 2 <= 1:
filtered_points.append((x, y))
return filtered_points
上述代码中,points
为步骤1生成的所有点的列表,filtered_points
为筛选后的在单位圆内的点的列表。如果点满足$x^2+y^2\le1$这个条件,则将其加入到filtered_points
列表中。
至此,我们就完成了生成均匀分布在单位圆内的点,完整代码如下:
import random
def generate_points(n):
"""生成n个均匀分布在正方形区域内的点"""
points = []
for i in range(n):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
points.append((x, y))
return points
def filter_points(points):
"""筛选出在单位圆内的点"""
filtered_points = []
for x, y in points:
if x ** 2 + y ** 2 <= 1:
filtered_points.append((x, y))
return filtered_points
n = 1000 # 生成1000个点
points = generate_points(n)
filtered_points = filter_points(points)
print(f"生成的点数:{len(points)}")
print(f"筛选后的点数:{len(filtered_points)}")
输出结果为:
生成的点数:1000
筛选后的点数:791
可以看到,生成的点数为1000,经过筛选后在单位圆内的点数为791,接近于理论上的分布数量,从而实现了随机生成均匀分布在单位圆内的点。
示例说明
示例1
若要生成1万个均匀分布在单位圆内的点,可以设置n = 10000,再按照上述方法得到结果。
import random
def generate_points(n):
"""生成n个均匀分布在正方形区域内的点"""
points = []
for i in range(n):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
points.append((x, y))
return points
def filter_points(points):
"""筛选出在单位圆内的点"""
filtered_points = []
for x, y in points:
if x ** 2 + y ** 2 <= 1:
filtered_points.append((x, y))
return filtered_points
n = 10000 # 生成10000个点
points = generate_points(n)
filtered_points = filter_points(points)
print(f"生成的点数:{len(points)}")
print(f"筛选后的点数:{len(filtered_points)}")
输出结果为:
生成的点数:10000
筛选后的点数:7878
可以看到,生成的点数为10000,筛选后在单位圆内的点数为7878,接近于理论上的分布数量,从而实现了随机生成均匀分布在单位圆内的1万个点。
示例2
若要生成均匀分布在单位球面内的100个点,可以在步骤1中生成均匀分布在正方体区域内的点,然后在步骤2中筛选出在单位球面内的点。
首先生成均匀分布在正方体区域内的代码如下:
import random
def generate_points(n):
"""生成n个均匀分布在正方体区域内的点"""
points = []
for i in range(n):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
z = random.uniform(-1, 1)
points.append((x, y, z))
return points
生成的点中,概率不再均匀分布,因此可以使用接下来的算法实现筛选。
其次筛选出在单位球面内的点,代码如下:
import math
def filter_points(points):
"""筛选出在单位球面内的点"""
filtered_points = []
for x, y, z in points:
if x ** 2 + y ** 2 + z ** 2 <= 1:
filtered_points.append((x, y, z))
return filtered_points
上述代码中,x ** 2 + y ** 2 + z ** 2 <= 1
表示点$(x,y,z)$距离坐标系原点的距离小于等于1,从而满足在单位球面内的条件。
将两段代码组合得到完整代码:
import random
import math
def generate_points(n):
"""生成n个均匀分布在正方体区域内的点"""
points = []
for i in range(n):
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
z = random.uniform(-1, 1)
points.append((x, y, z))
return points
def filter_points(points):
"""筛选出在单位球面内的点"""
filtered_points = []
for x, y, z in points:
if x ** 2 + y ** 2 + z ** 2 <= 1:
filtered_points.append((x, y, z))
return filtered_points
n = 100 # 生成100个点
points = generate_points(n)
filtered_points = filter_points(points)
print(f"生成的点数:{len(points)}")
print(f"筛选后的点数:{len(filtered_points)}")
输出结果为:
生成的点数:100
筛选后的点数:66
可以看到,生成的点数为100,筛选后在单位球面内的点数为66,接近于理论上的分布数量,从而实现了随机生成均匀分布在单位球面内的100个点。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python随机生成均匀分布在单位圆内的点代码示例 - Python技术站