Está en la página 1de 5

Bloque 1Bloque 2Referencias

Números aleatorios 

1. Números aleatorios y 
generadores 

Introducción 
Los números aleatorios tienen importantes aplicaciones en programación, entre las que
se incluye la criptografía, la simulación y la comprobación de programas. 
En muchas ocasiones, en computación se requiere el uso de números aleatorios, sobre
todo en los sistemas de simulación. Sin embargo, no es tan fácil implementar buenos
generadores de números aleatorios. 

La verdadera aleatoriedad es imposible de alcanzar en una computadora, ya


que los números obtenidos dependen del algoritmo empleado en su
generación y esto los convierte en aleatorios. Ahora bien, generalmente, es
suficiente producir números pseudo-aleatorios, esto es, números que parecen
aleatorios, en el sentido de que satisfacen muchas de las propiedades que
cumplen los números aleatorios. (Weiss, 2000). 

Supongamos que necesitamos simular el lanzamiento de una moneda. Una forma de


hacerlo es examinar el reloj interno del sistema, ya que nos indica el número de
segundos de la hora actual. Si esta cantidad es par, podemos retornar 0 (cara) y, si es
impar, podemos retornar 1 (cruz). El método de la siguiente figura muestra la
implementación en Java: 
Figura 1

El problema es que esta estrategia no funciona correctamente si necesitamos generar


una secuencia de números aleatorios. En tal caso, lo más probable es que se genere una
secuencia completa de ceros o unos y evidentemente esto dista mucho de ser aleatorio.
Esto ocurre porque en un mismo segundo se realizan varios cálculos para generar el
número aleatorio. Para probar lo expuesto, basta con ver qué resultado nos da la
ejecución del método lanzarMoneda unas 10 veces: 
Figura 2

Así, verificamos que lo que se imprime por pantalla (consola) es una lista de 10 números
todos iguales (unos o ceros). Tampoco nos sirve si tomamos los milisegundos en vez de
los segundos, ya que el programa está haciendo más cosas entre las llamadas al
generador, la secuencia de números generada no sería aleatoria, ya que el tiempo
transcurrido entre las llamadas al generador sería prácticamente idéntico en cada
invocación del programa, con lo que los resultados que se producirían al realizar distintas
ejecuciones serían demasiado parecidos. 

2. La clase Random 


Como se describe en “Procedimientos Numéricos en Lenguaje Java: Diciembre de 2001”,
la clase Random proporciona un generador de números aleatorios que es más flexible
que la función estática random de la clase Math. 

Para crear una secuencia de números aleatorios, tenemos que seguir los siguientes
pasos: 

1) Proporcionar a nuestro programa información acerca de la clase Random. Al principio


del programa, escribiremos la siguiente sentencia: import java.util.Random. 

Figura 3

2) Crear un objeto de la clase Random. 



que generan un número aleatorio. 
3) Llamar a una de las funciones miembro
4) Usar el número aleatorio. 

Constructores 

La clase dispone de dos constructores. El primero crea un generador de números


aleatorios cuya semilla es inicializada con base en el instante de tiempo actual. 
Figura 4

El segundo inicializa la semilla con un número del tipo long. 


Figura 5

El sufijo L no es necesario, ya que, aunque 3816 es un número int por defecto, es


promocionado automáticamente a long. 

Aunque no podemos predecir qué números se generarán con una semilla particular,
podemos, sin embargo, duplicar una serie de números aleatorios usando la misma
semilla, es decir, cada vez que creamos un objeto de la clase Random con la misma
semilla, obtendremos la misma secuencia de números aleatorios. Esto no es útil en el
caso de loterías, pero puede serlo en el caso de juegos, exámenes basados en una
secuencia de preguntas aleatorias, las mismas para cada uno de los estudiantes,
simulaciones que se repitan de la misma forma una y otra vez, entre otros. 

Funciones miembro 

Podemos cambiar la semilla de los números aleatorios en cualquier momento llamando a


la función miembro setSeed.
Figura 6

Podemos generar números aleatorios de cuatro formas diferentes: 


Figura 7

Genera un número aleatorio entero de tipo int: 


Figura 8

Genera un número aleatorio entero de tipo long.


Figura 9

Genera un número aleatorio de tipo float entre 0.0 y 1.0, aunque siempre menor que
1.0: 
Figura 10

Genera un número aleatorio de tipo Double entre 0.0 y 1.0, aunque siempre menor que
1.0:

​Casi siempre usaremos esta última versión. Por ejemplo, para generar una secuencia de
10 números aleatorios entre 0.0 y 1.0, escribimos: 
Figura 11

Para crear una secuencia de 10 números aleatorios enteros comprendidos entre 0 y 9


(ambos incluidos), escribimos: 
Figura 12

(int) transforma un número decimal Double en entero int eliminando la parte decimal. 
Comprobación de la uniformidad de los números aleatorios 

Podemos comprobar la uniformidad de los números aleatorios generando una secuencia


muy grande de números aleatorios enteros comprendidos entre 0 y 9, ambos inclusive.
Contamos cuántos ceros aparecen en la secuencia, cuántos unos... cuántos nueves, y
guardamos estos datos en los elementos de un array. 

Primero creamos un array ndigitos de 10 de elementos que son enteros. 


Figura 13

Inicializamos los elementos del array a cero.


Figura 14

Creamos una secuencia de 100 000 números aleatorios enteros comprendidos entre 0 y
9, ambos inclusive (véase el apartado anterior): 
Figura 15

Si n sale cero, se suma una unidad al contador de ceros, ndigitos[0]. Si n sale uno, se
suma una unidad al contador de unos, ndigitos[1], y así sucesivamente. 

Finalmente, se imprime el resultado: los números que guardan cada uno de los
elementos del array ndigitos. 
Figura 16

Observaremos en la consola que cada número 0, 1, 2... 9 aparece aproximadamente 10


000 veces. 
Secuencias de números aleatorios 

En la siguiente porción de código, se imprimen dos secuencias de cinco números


aleatorios uniformemente distribuidos entre [0, 1), separando los números de cada una
de las secuencias por un carácter tabulador.
Figura 17

Comprobaremos que los números que aparecen en las dos secuencias son distintos. 

En la siguiente porción de código, se imprimen dos secuencias iguales de números


aleatorios uniformemente distribuidos entre [0, 1). Se establece la semilla de los números
aleatorios con la función miembro setSeed. 
Figura 18

Fuente: http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/clases1/azar.htm

Referencias
Weiss, M. A. (2000). Estructuras de Datos en Java. Buenos Aires, AR: Adisson Weisley.

También podría gustarte