如何解决如何编写空间相关的随机数分布?
我编写了一个例程,该例程在我的研究区域中随机(均匀地)以任意直径分布圆。
def no_nearby_dots(new_dot,dots_sim,min_distance):
for dot in dots_sim:
if np.sqrt((dot[0] - new_dot[0]) ** 2 + (dot[1] - new_dot[1]) ** 2) <= min_distance:
return False
return True
while realizations < simulations:
dots_sim = []
new_dot = True
dots_sim.append((np.random.uniform(xmin,xmax),np.random.uniform(ymin,ymax)))
Failed_attempts = 0
while new_dot:
xp = np.random.uniform(xmin,xmax)
yp = np.random.uniform(ymin,ymax)
if no_nearby_dots((xp,yp),diameter):
dots_sim.append((xp,yp))
Failed_attempts = 0
else:
Failed_attempts += 1
if len(dots_sim) == n_sim:
new_dot = False
if Failed_attempts > 2000:
new_dot = False
print('ERROR...exit loop')
break
x_sim = [dot[0] for dot in dots_sim]
y_sim = [dot[1] for dot in dots_sim]
我想在初始圆周围引入第二个圆,在该圆上,向内部边界分配点的可能性呈指数下降->我要防止“硬”边界,允许点出现在飞机上的任何位置,但不允许出现比diameter
更近,它们只能在diameter
和diameter2
之间出现一定程度的变化。
有什么想法吗?
解决方法
这是个主意。
选择diameter/2
和diameter2/2
之间的随机半径,然后在由该半径形成的圆中生成随机点。有多种方法可以选择满足您要求的半径。例如,以下内容选择的半径使得很可能选择非常接近diameter2/2
的半径:
radius = (diameter1/2) + ((diameter2/2) - (diameter1/2)) * random.random()**(1/20)
请注意,1/20是统一(0,1)随机数的第20个根。尝试将1/20更改为其他值,看看会发生什么。
还有其他选择半径的方法,它们都可以由概率密度函数来描述(有关更多信息,请参见以下答案:Generate a random point within a circle (uniformly),其中显示了线性密度函数如何导致圆点的均匀分布。
,我解决了它,这就是我所做的:
while realizations < simulations:
dots_sim = []
new_dot = True
dots_sim.append((np.random.uniform(x_min,x_max),np.random.uniform(y_min,y_max)))
failed_attempts = 0
while new_dot:
x = np.random.uniform(x_min,x_max)
y = np.random.uniform(y_min,y_max)
diameter_simulation = np.random.uniform(min_diameter,max_diameter)
if no_nearby_dots((x,y),dots_sim,diameter_simulation):
dots_sim.append((x,y))
failed_attempts = 0
else:
failed_attempts += 1
if len(dots_sim) == len(x_coordinate):
new_dot = False
if failed_attempts > 1000:
new_dot = False
print('ERROR... -> no more space to place QDs! -> exit loop!')
break
我所做的是使用任意间隔内均匀分布的数字为我的圆创建直径,这可以平滑我的累积分布函数。这是我需要的解决方案,但它可能不太适合最初的问题(或者问题最初的表述不准确:p)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。