es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué función cúbica puedo utilizar para obtener una distribución aleatoria sesgada hacia el centro?

Quiero un círculo con más círculos dentro (no necesariamente adentro). La posición de los círculos interiores se determina al azar de tal manera que debería haber más círculos en el centro y menos y menos a medida que se aleja del borde del círculo.

De esta pregunta, deduje que los números pueden estar sesgados usando f(x) en lugar de solo x, x siendo el número aleatorio, por supuesto. Aquí está el código:

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)

Para las personas no familiarizadas con pygame, el círculo verde tiene un radio de 50 y se dibuja en (300, 300) y los círculos rojos se dibujan en (p[0] + 300, p[1] + 300)

Aquí usé x ** 3 pero no funcionó. Necesito ayuda para elegir la función correcta. Aquí está lo que tengo.

Sé que el resto del código es correcto porque utilicé otra función mencionada en esa respuesta (f(X)=2X/(1+X)) y da la distribución correcta, sesgada hacia los valores más altos:

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))

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que la función actual x ** 3 no está produciendo el sesgo deseado para la creación de círculos. Para lograr el resultado deseado de tener más círculos en el centro y menos hacia el borde, se puede usar una función diferente. Una posibilidad es la función gaussiana, que se puede implementar en Python utilizando la función math.exp con un exponente negativo:

    import math
    
    def distBiasedMiddleGaussian(_min, _max):
        r = lambda : random.uniform(0, 1)
        r1, r2 = r(), r()
        bias = lambda _r: (_max - _min) * math.exp(-16 * (_r - 0.5) ** 2) + _min
        return (bias(r1), bias(r2))
    

    En esta implementación, la función math.exp toma el cuadrado negativo de 16 * (_r - 0.5), lo que significa que los valores cercanos a 0.5 (es decir, el centro) tendrán un peso mayor y los valores más alejados de 0.5 tendrán un peso menor.

    Esta nueva función se puede utilizar en el código existente cambiando la variable testBias:

    testBias = distBiasedMiddleGaussian
    

    La ejecución del código modificado debería producir un círculo con más círculos cerca del centro:

    enter image description here

Comments are closed.