3.4 Aleatorios

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. Por ejemplo el obtenido al lanzar un dado.

Un número aleatorio se define como un número real cualquiera en el intervalo [0,1)


En Python se requiere usar la librería random que se escribe en el bloque de inicio.

import random as rnd

la forma más básica de generar un número aleatorio en Python es:

>>> import random as rnd
>>> rnd.random()
0.28033599517631624
>>> rnd.random()
0.07239272147532794
>>> 

Para el desarrollo de los problemas iniciales, se mantendrá la forma simple de la instrucción, manteniendo el concepto de construcción de un número aleatorio a partir de un número real [0,1)



Ejemplo

Para simular un dado de seis caras, se utiliza el siguiente proceso:

dado ← entero(aleatorio*6)+1

que se contruye siguiendo los pasos:

1. Un número aleatorio

>>> import random as rnd
>>> aleatorio = rnd.random()
>>> aleatorio
0.9531257439341784

2. Se debe convertir del intervalo [0,1) al intervalo correspondiente.
Como el dado tiene 6 caras, se multiplica 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 al  sumarle 1.

>>> dado = int(aleatorio*6)+1
>>> dado
6

Con lo que la fórmula final se indica en el ejemplo, notando que cada vez que se ejecuta, se obtendrá un número que simula el lanzamiento de un dado.

>>> 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:

# 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.