Contenido principal
Principios de ciencias de la computación avanzados (AP Computer Science Principles)
Curso: Principios de ciencias de la computación avanzados (AP Computer Science Principles) > Unidad 6
Lección 2: Simular aleatoriedadGenerar números aleatorios
¿Alguna vez has lanzado una moneda o tirado dados? Si es así, generaste un valor aleatorio, y probablemente usaste ese valor para tomar una decisión.
También podemos generar valores aleatorios en nuestros programas de computadora, y usarlos para tomar decisiones y simular procesos naturales.
Generación de valores aleatorios
Por naturaleza, las computadoras no son muy buenas con el azar. Su fortaleza radica en generar salidas predecibles ejecutando secuencias de operaciones programadas. Eso es casi lo opuesto a la aleatoriedad.
Para generar un número verdaderamente aleatorio, una computadora necesitaría monitorear un proceso no determinístico que ocurra de manera natural, como la desintegración nuclear de una partícula de uranio. Eso es caro y lento, así que la mayoría de las computadoras personales no tienen generadores de números aleatorios reales.
Sin embargo, los científicos de computación han encontrado formas de generar números "pseudo-aleatorios" con software de computadoras, que son suficientemente buenos para la mayoría de los propósitos.
Los lenguajes de programación y las bibliotecas proporcionan procedimientos para generar esos números pseudo-aleatorios.
En JavaScript,
Math.random()
genera un número pseudo-aleatorio entre 0 (inclusive) y 1 (exclusive). El siguiente programa muestra un número generado con
Math.random()
. Pulsa "Restart" para ver cómo cambia cada vez.Cuando se llama suficientes veces,
Math.random()
eventualmente generará el número 0. Sin embargo, nunca generará 1. Por eso decimos que incluye 0 y excluye 1. Esta línea numérica visualiza todos los posibles valores generados en azul:
¿Qué pasa si necesitamos un número más grande? Tal vez nuestro programa dibuja un árbol con altura de 0 a 6 pies.
Podemos hacer eso multiplicando el resultado de
Math.random()
por 6. Pruébalo a continuación.Ese programa genera valores entre 0 (inclusive) a 6 (exclusive):
Generación de enteros aleatorios
¿Qué tal si limitamos los valores aleatorios a números enteros? Si simulamos un tiro de dados, no queremos terminar con números como "1.267" or "5.431". Sólo queremos ver enteros, que representan cada cara del dado.
Para esto, necesitamos redondear el resultado con
Math.floor()
. La función floor()
redondeará el valor hacia abajo al entero más cercano. Pruébalo a continuación. ¿Puedes generar todos los enteros posibles en el rango?
Una vez que hayas reiniciado el programa suficientes veces, eventualmente deberías verlo mostrar todos los enteros entre 0 y 5:
Estamos muy cerca de poder simular la tirada de un dado, pero no todavía allí. Nuestro programa genera los números 0-5, pero un dado estándar de 6 caras corresponde a los números 1-6:
Esta es una solución sencilla. Sólo sumamos 1 al resultado redondeado, y listo, ¡tenemos una simulación de tiro de dados!
Podriamos ver que con frecuencia queremos generar enteros aleatorios entre dos valores. Podríamos copiar y pegar el código de arriba... o, mejor aún, ¡podríamos crear nuestro propio procedimiento reutilizable!
El procedimiento
randomInt()
es una abstracción útil construida sobre Math.random()
, que nos permite generar enteros aleatorios sin preocuparnos por los detalles:Comprobación de valores aleatorios con condicionales
Ahora que sabemos cómo generar muchos rangos y tipos de números aleatorios, usemos esos números.
Podemos usar un condicional para comprobar el valor de un número aleatorio y seleccionar un código diferente a ejecutar basado en dicho valor.
Por ejemplo, este código simula un tiro aleatorio de una moneda:
if (Math.random() < 0.5) {
println("¡águila!");
} else {
println("¡sol!");
}
Cuando usamos un condicional para comprobar un valor aleatorio, debemos asegurar que nuestra condición corresponde a la posibilidad de que el evento deba ocurrir. En el código arriba
Math.random()
genera valores de 0 a 1, así que la condición comprueba si el valor está en la primera mitad del rango o no.Si simulamos posibilidades como "1 de 4", es un buen momento para usar un
if
/else
encadenado con el procedimiento randomInt()
mencionado arriba:var val = randomInt(1, 4);
if (val === 1 ) {
println("1");
} else if (val === 2 ) {
println("2");
} else if (val === 3 ) {
println("3");
} else {
println("4");
}
Cuando comprobamos si el código funciona como se espera, no podemos ejecutarlo una sola vez; eso solo mostrará un valor y un camino en el código. Tenemos que ejecutarlo varias veces, asegurando que la computadora eventualmente seleccione todos los caminos posibles
Si queremos aún más confiabilidad, podríamos ejecutarlo miles de veces y verificar que la distribución de caminos en el código coincide con nuestras expectativas. Para el código anterior, veríamos cada camino seleccionado alrededor del 25% del tiempo. No sería exactamente 25%, pero estaría cerca.
✏️ El siguiente programa simula un juguete mágico de 8-Ball con 7 respuestas diferentes. Cambia los mensajes a tu gusto y reinicia el programa suficientes veces para asegurarte que todos tus mensajes se muestren en pantalla.
Números aleatorios en pseudocódigo
Hay muchas variaciones en los procedimientos de generación de números aleatorios en los diferentes lenguajes de programación y bibliotecas.
Este pseudocódigo representa el caso común de generar un número entre
inicio
y fin
(incluyendo tanto inicio
como fin
):RANDOM(inicio, fin)
Esta es una versión en pseudocódigo del código que genera 1 de 4 posibilidades:
val ← RANDOM(1, 4)
IF (val = 1 )
{
DISPLAY("1")
}
ELSE IF (val = 2 )
{
DISPLAY("2")
}
ELSE IF (val = 3 )
{
DISPLAY("3")
}
ELSE
{
DISPLAY("4")
}
🙋🏽🙋🏻♀️🙋🏿♂️¿Tienes alguna pregunta sobre este tópico? Nos encantaría contestarte; ¡simplemente pregunta en el area de preguntas abajo!
¿Quieres unirte a la conversación?
Sin publicaciones aún.