Important
Introduzca a continuación su nombre y apellidos:
Fulano Mengano Zutano
Caution
El objetivo de esta tarea es la implementación y uso de iteradores. Probablemente pueda encontrar en el mercado soluciones más brillantes de las que usted es capaz de escribir, pero, en esta tarea, estamos interesados en conocer su solución, así que el uso de esas otras soluciones está prohibido.
¿Quiere saber más?, consulte con el profesorado.
El algoritmo de generación lineal congruente LGC permite generar secuencias pseudoaleatorias de características controladas. Se basa en aplicar iterativamente la fórmula recursiva siguiente:
Donde se denomina módulo a
La secuencia es periódica, ya que, cada vez que repetimos un valor de
El módulo
-
$m$ y$c$ no deben tener factores primos en común. -
$a - 1$ debe ser divisible por todos los factores primos de$m$ (aunque no mucho). - Si
$m$ es divisible por 4,$a - 1$ también debe serlo, pero no por 8.
Por ejemplo, el generador aleatorio del estándar POSIX usa los valores siguientes:
Escriba el fichero aletaorios.py que implemente la generación de números aleatorios
usando tanto una clase iterable, Aleat, como una función generadora aleat().
Escriba la clase Aleat que implemente un generador de números aleatorios en el rango
-
Los objetos de la clase serán iteradores, para lo que habrá de definirse el método mágico
__next__(), que será el que efectuará la generación en sí misma y deberá devolver el número aleatorio siguiente. -
Los valores de
m,aycy la semillax0deben ser configurables al crear el objeto (argumentos opcionales del método mágico__init__()). Estos cuatro argumentos opcionales serán indicados, obligatoriamente, por clave (no pueden ser posicionales).Por defecto, los valores de
m,aycserán los usados por el estándar POSIX. El de la semilla seráx0=1212121. -
El método mágico
__call__()que sobrecarga la llamada a función, es decir, el uso del objeto como si fuera una función con sus argumentos entre paréntesis, se usará para reiniciar la secuencia con la semilla indicada en su único argumento, que será forzosamente posicional.
La cadena de documentación de la clase deberá incluir las siguientes pruebas unitarias
a ejecutar con la biblioteca doctest:
>>> rand = Aleat(m=32, a=9, c=13, x0=11)
>>> for _ in range(4):
... print(next(rand))
...
16
29
18
15>>> rand(29)
>>> for _ in range(4):
... print(next(rand))
...
18
15
20
1Escriba la función generadora aleat() que implemente el mismo generador de números
aleatorios en el rango
-
Los valores de
m,aycy la semillax0deben ser configurables al crear la función, y tendrán los mismos valores por defecto que en el caso de la claseAleat. -
En caso de enviársele un valor al generador, con su método
send(), éste debe reiniciar la secuencia tomando el argumento como semilla de la nueva secuencia.
La cadena de documentación de la clase deberá incluir las siguientes pruebas unitarias
a ejecutar con la biblioteca doctest:
>>> rand = aleat(m=64, a=5, c=46, x0=36)
>>> for _ in range(4):
... print(next(rand))
...
34
24
38
44>>> rand.send(24)
38
>>> for _ in range(4):
... print(next(rand))
...
44
10
32
14-
El fichero debe incluir una cadena de documentación que incluirá el nombre del alumno y una descripción el contenido del fichero.
-
La cadena de documentación de la clase
Aleatdebeá incluir:- Una descripción del cometido de la clase.
- Una descripción de los atributos y métodos de la clase.
- Las pruebas unitarias correspondientes.
-
La cadena de documentación de la función generadora
aleat()deberá incluir:- Una descripción del cometido de la función.
- Los argumentos de la función y la salida proporcionada.
- Las pruebas unitarias correspondientes.
-
Se valorará lo pythónico de la solución; en concreto, su claridad y sencillez, y el uso de los estándares marcados por PEP-ocho.
Inserte a continuación una captura de pantalla que muestre el resultado de ejecutar el
fichero aleatorios.py con la opción verbosa, de manera que se muestre el
resultado de la ejecución de los tests unitarios.
Inserte a continuación el código de los métodos desarrollados en esta tarea, usando los comandos necesarios para que se realice el realce sintáctico en Python del mismo (no vale insertar una imagen o una captura de pantalla, debe hacerse en formato markdown).
La entrega se formalizará mediante pull request al repositorio de la tarea.
El fichero README.md deberá respetar las reglas de los ficheros Markdown y
visualizarse correctamente en el repositorio, incluyendo la imagen con la ejecución de
los tests unitarios y el realce sintáctico del código fuente insertado.