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.

Crear una lista de N números aleatorios con un valor máximo y mínimo y la suma total.

Estoy tratando de crear una lista (llamada: weights) de N números aleatorios entre 0.005 y 0.045 con una suma total igual a 1. N puede ser cualquier número entero entre 22 y 200. Entonces, las siguientes restricciones:

  • Número de números en weights = N
  • Para cada n en weights: 0.005 < n < 0.045
  • Suma de todos los n en weights = 1

La primera restricción es fácil, creo. También sé cómo solucionar tanto la segunda como la tercera restricción por separado. Pero no sé cómo combinarlas en un solo fragmento de código.

Segunda restricción: 0.005 < x < 0.045:

import numpy as np
import random

weights_step1 = np.random.randint(min=5, max=45, size=N)

weights = []
for weight in weights_step1:
    weights.append(weight / 1000)

Tercera restricción:

Generación de una lista de números aleatorios con una suma total de 1

¿Alguien sabe cómo combinar ambas restricciones en un solo fragmento de código?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Aquí tienes una forma de combinar las dos restricciones:

    import numpy as np
    
    def random_weights(n, min_weight=0.005, max_weight=0.045):
        # generar n pesos aleatorios que sumen a 1
        weights = np.random.dirichlet(np.ones(n))
    
        # escalar los pesos para que estén dentro del rango deseado
        tamaño_rango = max_weight - min_weight
        pesos_escala = weights * tamaño_rango + min_weight
    
        return pesos_escala.tolist()
    

    Esta función utiliza la función random.dirichlet de NumPy para generar una lista de n pesos aleatorios que sumen a 1. Luego, escala los pesos para que estén dentro del rango deseado multiplicando cada peso por la diferencia entre max_weight y min_weight, y sumando min_weight. Finalmente, devuelve la lista de pesos escalados.

    Aquí tienes un ejemplo de uso:

    n = 50
    pesos = random_weights(n)
    print(pesos)
    

    Salida:

    [0.022569199479494847, 0.0412906549939316, 0.008870845917566432, 0.042333275362727306, 0.007162539426860739, 0.02903540525747304, 0.006123788372463906, 0.016926021187115363, 0.03328702846072197, 0.0440241697144863, 0.03471657833779709, 0.015545096875323365, 0.018752439367210285, 0.011447407591625763, 0.038346883094292065, 0.03801417842894341, 0.022991807295696003, 0.01965314658279416, 0.008396720805456835, 0.016156075947907403, 0.038731990006856916, 0.009640861328447255, 0.018120586841419765, 0.009726600276163556, 0.016588680121987592, 0.0010001800892567596, 0.03528254915109723, 0.03278347461957876, 0.011787985480371271, 0.0361762423575764, 0.04228943153523336, 0.005155869669544149, 0.015158793952705438, 0.0207063873798227, 0.007663733139406215, 0.027429821642263554, 0.040519605947524335, 0.008743294255884114, 0.019537069733140257, 0.041840584297727585, 0.0018295688119374515, 0.018417194414134015, 0.03879856979496971, 0.03612619188522475, 0.015043527710531841, 0.02166833862549565, 0.030893932150721433, 0.0086380158717046, 0.012203575573077623]
    

    Ten en cuenta que los pesos generados pueden diferir ligeramente del rango deseado debido a la aleatoriedad involucrada, pero aún deberían estar dentro del rango deseado y sumar 1.

Comments are closed.