Referencia: Van Rossum 10.6 p85, Rodriguez 5.9 p99, Downey 12.1
Para simular un número de azar se recurre al concepto de números aleatorios, que por ejemplo es el valor obtenido al lanzar un dado para juegos de tablero. Si el dado es estándar, no se puede predecir el valor que saldrá en el dado.
Un número aleatorio se define como un número real cualquiera en el intervalo [0,1).
La forma básica de generar un número aleatorio en Python es usando la librería random()
, que se puede usar con operaciones adicionales para simulaciones de dados, movimientos en juegos, etc.
>>> import random as rnd >>> rnd.random() 0.28033599517631624 >>> rnd.random() 0.07239272147532794 >>>
Ejemplo de número aleatorios para un dado en Python
Para simular un dado de seis caras, que es un número aleatorio entero en el intervalo [0,6] se construye paso a paso:
dado ← entero(aleatorio*6)+1
1. Un número aleatorio
Se empieza con la forma básica para generar un número aleatorio entre [0,1)
>>> import random as rnd >>> aleatorio = rnd.random() >>> aleatorio 0.9531257439341784
2. Se debe convertir del intervalo [0,1) al intervalo de un dado de 6 caras,
multiplicando el aleatorio por 6, obteniendo un real de [0,6). No se incluye el 6.
>>> dado = aleatorio*6 >>> dado 5.7187544636050704
3. Sin embargo, el aleatorio de un dado es un número entero
Se extrae solo la parte entera para obtener un número entero [0,5]
>>> dado = int(aleatorio*6)
>>> dado
5
4. Para que el resultado sea [1,6],
se desplaza el intervalo a la derecha sumándole 1, con lo que el valor mínimo es 1 y el máximo será 6
>>> dado = int(aleatorio*6)+1
>>> dado
6
La fórmula final del ejemplo usada varias veces, mostrará que se obtiene un número diferente semejante a lanzar un dado de seis caras.
>>> dado = int(rnd.random()*6)+1 >>> dado 1 >>> dado = int(rnd.random()*6)+1 >>> dado 3 >>>
Referencia: Elementos esenciales para programación: Algoritmos y Estructuras de Datos Latin Project. Primera Edición 2014. Sección 4.42. p.86
Ejercicio 1
1Eva_IT2008_T3 Simular precio de petroleo
Realice un algoritmo para simular el precio del barril de petróleo durante un mes de 30 días, suponiendo que son valores enteros que fluctúan en forma aleatoria entre $ 130 y $ 150 y se obtenga las siguientes respuestas:
a) El promedio del precio del petróleo.
b) ¿Cuál fue el día en el que estuvo más barato el barril de petróleo?
Desarrollo
Para iniciar el algoritmo, se puede considerar como variable de entrada los días del mes, o asignarles directamente 30 días.
La primera aproximación al problema para responder el literal a) consiste en generar números aleatorios en el rango [130, 150] y acumular sus valores para el promedio.
Será necesario disponer de un contador para controlar el número de veces que se generan los precios de forma aleatoria en el lazo de repetición.
Una de las formas de resolver el problema es con un lazo repita hasta, cuyo diagrama de flujo se muestra a continuación:
Instrucciones en Python
# Ejercicio 1. Precio del petroleo import random as rnd # INGRESO diasmes = int(input('dias que tiene el mes: ')) # PROCEDIMIENTO total = 0 dia = 0 rango = (150-130)+1 while not(dia>=diasmes): precio = int(rnd.random()*rango) + 130 total = total + precio dia = dia + 1 promedio = total/diasmes # SALIDA print(promedio)
dias que tiene el mes: 30 137.56666666666666 >>>
Para la pregunta b) es necesario analizar la manera de encontrar el día con el precio más barato.
En este caso se utilizará el algoritmo para búsqueda del menor, que consiste en iniciar con el supuesto para el valor menor de precio y día, probando contra el precio de cada día y de ser necesario se cambian los valores menores.
Es un similar al caso de usar una hipótesis y realizar luego las pruebas.
Como supuesto, se escogerá el valor máximo de precio con el objetivo que el primer precio que aparece sustituye los valores.
# Ejercicio 1. Precio del petroleo import random as rnd # INGRESO diasmes = int(input('dias que tiene el mes: ')) # PROCEDIMIENTO total = 0 dia = 0 rango = (150-130)+1 diamenor = 0 preciomenor = 150 while not(dia>=diasmes): precio = int(rnd.random()*rango) + 130 total = total + precio if (precio<preciomenor): diamenor = dia preciomenor = precio dia = dia + 1 promedio = total/diasmes # SALIDA print(promedio) print(diamenor)
dias que tiene el mes: 30 140.06666666666666 22 >>>
Otra forma de realizar el algoritmo consiste en cambiar la perspectiva del lazo repita- hasta por un mientras repita. Para el cambio será necesario solo negar la expresión usada en el lazo repita-hasta en días<diasmes.