Encuentre todas las posibilidades de una distribución porcentual (2 puntos decimales) para hacer algo en cada caso.
Aquí está el problema, necesito ejecutar una función para cada posibilidad de porcentaje (2 puntos decimales). Para eso, necesito un algoritmo que identifique cada caso para n elementos.
Por ejemplo:
Un arreglo de 2 elementos tendría la siguiente distribución:
[1.00, 0.00]
[0.99, 0.01]
[0.98, 0.02]
[0.97, 0.03]
[...]
Pero en casos de más elementos, esto es más complejo:
[1.00, 0.00, 0.00, 0.00]
[0.99, 0.01, 0.00, 0.00]
[0.99, 0.00, 0.01, 0.00]
[0.99, 0.00, 0.00, 0.01]
[0.98, 0.02, 0.00, 0.00]
[0.98, 0.01, 0.01, 0.00]
[0.98, 0.01, 0.00, 0.01]
[0.98, 0.00, 0.02, 0.00]
[0.98, 0.00, 0.01, 0.01]
[0.98, 0.00, 0.00, 0.02]
[0.97, 0.03, 0.00, 0.00]
[0.97, 0.02, 0.01, 0.00]
[0.97, 0.02, 0.00, 0.01]
[0.97, 0.01, 0.02, 0.00]
[0.97, 0.01, 0.00, 0.02]
[0.97, 0.01, 0.01, 0.01]
[0.97, 0.00, 0.03, 0.00]
[0.97, 0.00, 0.00, 0.03]
[0.97, 0.00, 0.02, 0.01]
[0.97, 0.00, 0.01, 0.02]
[...]
¿Alguien conoce una forma de encontrar estos casos para n elementos?
No es necesario guardar el arreglo en memoria, solo ejecutar una función o una parte del código para cada uno de estos casos.
Este código/función podría ser simplemente una impresión del caso.
Acepto cualquier lenguaje como respuesta, gracias por su atención.
[Edit 1] La solución que creé con la ayuda de Alejandro fue la siguiente:
import numpy as np
n = 4
f = open("possibilities.txt", "w")
def getPossibilities(array):
if array == None:
array = []
alreadySummed = sum(array)
remaining = round(1 - alreadySummed, 2)
if(len(array) == n-1):
newArr = [*array, remaining]
f.write(str(newArr) + "\n")
return
allRemainingPossibilities = np.arange(0, remaining + 0.01, 0.01)
for possibility in allRemainingPossibilities:
newArr = [*array, round(possibility, 2)]
getPossibilities(newArr)
getPossibilities(None)
f.close()
Básicamente, para cada posibilidad inicial, el código busca las posibilidades restantes. Y en cascada, me muestra todas las posibilidades.
davy.ai
Como modelo de lenguaje de IA, puedo proporcionar un algoritmo potencial para resolver este problema:
n
, para encontrar las posibilidades.output
, para almacenar los resultados.i
, desde 1.00 hasta 0.00 en decrementos de 0.01 (incluyendo):n
es 1, agrega[i]
aoutput
y continúa con la siguiente posibilidad.n
es mayor que 1, llama recursivamente al algoritmo conn-1
y el porcentaje restante,1-i
, como argumentos.i
al principio de la lista y luego agrega la posibilidad aoutput
.output
.Aquí hay una implementación posible de este algoritmo en Python:
Esta implementación utiliza la recursividad para iterar a través de todas las combinaciones posibles de elementos y porcentajes. Inicializa una lista vacía,
output
, para almacenar los resultados y luego recorre cada posibilidad,i
, desde 1.00 hasta 0.00 en decrementos de 0.01. Sin
es 1, agrega la posibilidad actual aoutput
. De lo contrario, realiza una llamada recursiva a la función conn-1
y el porcentaje restante,1-i
, como argumentos. Para cada posibilidad devuelta por la llamada recursiva, agregai
al principio de la lista y luego agrega esa posibilidad aoutput
. Finalmente, devuelveoutput
, que contiene todas las combinaciones posibles de elementos y porcentajes para el valorn
dado.