这里写自定义目录标题
策划给了个需求,给定一个圆环,内径r1,外径r2,要在圆环内随机产生点,在这些点位置上生成法术场。那么如何在圆环内随机产生这些点呢?
在圆内随机生成点
首先考虑在圆内生成随机点。
最简单的方法是在一个R*R的正方形内随机选取一个点,判断随机生成的点是否在圆内即可。python代码如下:
import random
def generateRandomPoint(r):
while True:
x = random.uniform(-r, r)
y = random.uniform(-r, r)
if x * x + y * y <= r * r:
return x,y
还有一个简单的方法是:
先随机x的值, 根据
,随机y的范围。
python代码如下:
import math
import random
def generateRandomPoint3(r):
x = random.uniform(-r, r)
square = math.sqrt(r*r-x*x)
y = random.uniform(-square, square)
return x,y
还有一个方法是根据半径和角度确定坐标
python代码
import math
def generateRandomPoint1(r):
random_r = random.uniform(0, r)
random_theta = random.uniform(0, 2 * math.pi)
return random_r * math.cos(random_theta), random_r * math.sin(random_theta)
但是很明显,上面生成的点的数据不是均匀分布的。
原因:
我们期望随机生成的点在圆上是均匀分布的。假设在半径为1的圆内生成点。假设一开始半径是0.5,生成角度在
的点的密度明显要大于半径1.0,生成角度在
的点。
即圆的半径
增长和半径
正相关,即半径越大,需要的点也是线性增长的。即pdf也是线性增长的。由于pdf的面积大小是1,我们的半径长度是1,即
PDF表示概率密度函数(给出了变量落在某值xi邻域内(或者某个区间内)的概率变化快慢,概率密度函数的值不是概率,而是概率的变化率,概率密度函数下面的面积才是概率。见2)
那么如何根据一个均匀分布的随机生成函数random.uniform来产生我们需要的定点呢?
生成CDF(累计分布函数)
交换x,y
使用均匀分布函数带入
python代码
import math
def generateRandomPoint2(r):
random_r = math.sqrt(random.uniform(0, r))
random_theta = random.uniform(0, 2 * math.pi)
return random_r * math.cos(random_theta), random_r * math.sin(random_theta)
在圆环内随机生成点
最简单的方法是在一个R*R的正方形内随机选取一个点,判断随机生成的点是否在圆环内即可。python代码如下:
def generateRandomPointFromAnnulus(r1,r2):
"""
在圆环内随机取点, r1<=r2
:param r1: 内径
:param r2: 外径
:return:
"""
assert r1<= r2
while True:
x = random.uniform(-r2, r2)
y = random.uniform(-r2, r2)
if x * x + y * y <= r2 * r2 and x * x + y * y >= r1 * r1:
return x,y
第二种方法是随机先随机得到x的值,然后算出y的范围,随机y的值,python代码如下:
扫描二维码关注公众号,回复:
8743313 查看本文章
import math
def generateRandomPointFromAnnulus1(r1,r2):
"""
在圆环内随机取点, r1<=r2
:param r1: 内径
:param r2: 外径
:return:
"""
assert r1<= r2
x = random.uniform(r1, r2)
y = random.uniform(math.sqrt(x*x-r1*r1), math.sqrt(r2*r2-x*x))
return x if random.uniform(-1,1) > 0 else -x, y if random.uniform(-1,1) > 0 else -y
类似求圆的概率密度函数,分布函数
生成CDF(累计分布函数)
和圆不一样,概率密度函数是从 ,而不是
交换x,y
使用均匀分布函数带入
python代码
import math
def generateRandomPointFromAnnulus2(r1,r2):
"""
在圆环内随机取点, r1<=r2
:param r1: 内径
:param r2: 外径
:return:
"""
assert r1<= r2
a = 1 / (r2*r2-r1*r1)
random_r = math.sqrt(random.uniform(0, 1) + r1 * r1)
random_theta = random.uniform(0, 2 * math.pi)
return random_r * math.cos(random_theta), random_r * math.sin(random_theta)