我可以使用什么三次函数来获得偏向中间的随机分布

What cubic function can I use to get a random distribution biased towards the middle

我想要一个里面有更多圆圈的圆圈(不一定要在里面)。内圈的位置是随机确定的,中间的圈数最多,越少越往外圈的边缘

this 问题中,我了解到使用 f(x) 而不仅仅是 x 可以使数字产生偏差,当然 x 是随机数。这是代码:

def distBiasedMiddle(_min, _max):
    r = lambda : random.uniform(0, 1)
    r1, r2 = r(), r()
    bias = lambda _r:  _r**3 * (1 + _max - _min) + _min
    return (bias(r1), bias(r2))

testBias = distBiasedMiddle

rps = []
for i in range(100):
    rps.append(testBias(-50, 50))

while True:

    for p in rps:
         pygame.draw.circle(window, (255, 0, 0), (p[0] + 300, p[1] + 300), 2)
    pygame.draw.circle(window, (0,255,0), (300, 300), 50, 1)

对于不熟悉 pygame 的人,绿色圆圈的半径为 50,绘制在 (300, 300) 处,红色圆圈绘制在 (p[0] + 300, p[1] + 300)

这里我用了x ** 3但是没用。我需要帮助选择正确的功能。这是我得到的。

我知道其余代码是正确的,因为我使用了该答案中提到的另一个函数 (f(X)=2X/(1+X)),它给出了正确的分布,偏向于较高的值:

def distBiasedUpper(_min, _max):
    r = lambda : random.uniform(0, 1)
    r1, r2 = r(), r()
    bias = lambda _r: (2 * _r / (1 + _r)) * (1 + _max - _min) + _min
    return (bias(r1), bias(r2))

实际上您正在生成 [0.01.0] 范围内的随机数并将它们分配给范围 [_min, _max].因此 0 映射到 _min。结果,_min.
附近的点多了 您必须生成 [-1.0, 1.0] 范围内的随机数并将它们映射到 [_min, _max] 范围内。所以 0 在范围的中间,大部分点都在 (_min + _max) / 2:

附近
def distBiasedMiddle(_min, _max):
    r = lambda : random.uniform(-1, 1)
    r1, r2 = r(), r()
    bias = lambda _r:  _r**3 * (_max - _min) / 2 + (_min + _max) / 2
    return (bias(r1), bias(r2))