3.4 Números Aleatorios, al Azar o random con Python



1. Número aleatorio o al azar

Referencia: Van Rossum 10.6 p85, Rodríguez 5.9 p99, Downey 12.1

dados para números aleatorios

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

aleatorio recta numérica

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


2. Número aleatorios para un dado en Python

numero aleatorio entero dado de seis caras

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)

aleatorio recta numérica
>>> 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.

numero aleatorio en intervalo[0.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]

número aleatorio [0,6) entero
>>> 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

número aleatorio [1,6] entero
>>> 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



3. Ejercicio

Referencia: 1Eva2008TI_T3 Simular precio de petroleo

promedio valores grafico

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?



4. Desarrollo de algoritmo

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)
precio petroleo aleatorio diagrama
Diagrama de Flujo ejercicio - números aleatorios
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)
precio petroleo aleatorio 02 diagrama
Diagrama de Flujo ejercicio - búsqueda de menor valor
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.

precio petroleo aleatorio 03 diagrama
Diagrama de Flujo ejercicio - aleatorios y búsqueda de menor valor con mientras-repita



Unidades FP