我可以使用什么三次函数来获得偏向中间的随机分布
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.0、1.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))
我想要一个里面有更多圆圈的圆圈(不一定要在里面)。内圈的位置是随机确定的,中间的圈数最多,越少越往外圈的边缘
从 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.0、1.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))