微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编写空间相关的随机数分布?

如何解决如何编写空间相关的随机数分布?

我编写了一个例程,该例程在我的研究区域中随机(均匀地)以任意直径分布圆。

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更近,它们只能在diameterdiameter2之间出现一定程度的变化。

有什么想法吗?

解决方法

这是个主意。

选择diameter/2diameter2/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 举报,一经查实,本站将立刻删除。