9.7. Muchos baldes

Tal como aumenta el numero de baldes, enElBalde se hace un tanto difícil de manejar. Con dos baldes, no esta mal:

   1: bajo = enElBalde(a, 0.0, 0.5)
   2: alto = enElBalde(a, 0.5, 1)

Pero con cuatro baldes ya es aparatoso.



   1: balde1 = enElBalde(a, 0.0, 0.25)
   2: balde2 = enElBalde(a, 0.25, 0.5)
   3: balde3 = enElBalde(a, 0.5, 0.75)
   4: balde4 = enElBalde(a, 0.75, 1.0)

Hay dos problemas. Uno es que tenemos que inventar nuevos nombres de variables para cada resultado. El otro es que tenemos que calcular el intervalo de cada balde.


Empezaremos por solucionar el segundo problema. Si el numero de baldes es numBaldes, la anchura de cada balde es 1.0 / numBaldes.


Usaremos un bucle para calcular el intervalo de cada balde. La variable del bucle, i, cuenta de 1 a numBaldes-1:




   1: anchuraBalde = 1.0 / numBaldes
   2: for i in range(numBaldes):
   3: minimo = i * anchuraBalde
   4: maximo = minimo + anchuraBalde
   5: print minimo, "hasta", maximo

Para calcular el límite inferior de cada balde, multiplicamos la variable de bucle por la anchura de balde. El límite superior esta a tan solo una anchuraBalde.


Con numBaldes = 8, la salida es:




   1: 0.0 hasta 0.125
   2: 0.125 hasta 0.25
   3: 0.25 hasta 0.375
   4: 0.375 hasta 0.5
   5: 0.5 hasta 0.625
   6: 0.625 hasta 0.75
   7: 0.75 hasta 0.875
   8: 0.875 hasta 1.0

Puede confirmar que todos los bucles tienen la misma anchura, que no se solapan y que cubren todo el intervalo entre 0,0 y 1,0.


Volvamos ahora al primer problema. Necesitamos un modo de almacenar ocho enteros, usando la variable de bucle para señalarlos uno por uno. En estos momentos debería usted estar pensando “Lista!”.


Debemos crear la lista de baldes fuera del bucle, porque solo queremos hacerlo una vez. Dentro del bucle, podemos llamar repetidamente a enElBalde y actualizar el i-esimo elemento de la lista:




   1: numBaldes = 8
   2: baldes = [0] * numBaldes
   3: anchuraBalde = 1.0 / numBaldes
   4: for i in range(numBaldes):
   5:     minimo = i * anchuraBalde
   6:     maximo = minimo + anchuraBalde
   7:     baldes[i] = enElBalde(lista, minimo, maximo)
   8: print baldes

Con una lista de 1000 valores, este código genera esta lista de baldes:



   1: [138, 124, 128, 118, 130, 117, 114, 131]

Estos números son razonablemente próximos a 125, que es lo que esperábamos.


Por lo menos, están lo bastante cerca como para que podamos pensar que el generador de números aleatorios funciona.


Como ejercicio, compruebe esta función con listas mas largas, y vea
si el numero de valores en cada balde tiende a equilibrarse.

0