Sunteți pe pagina 1din 4

Generar nmeros aleatorios

La clase Random proporciona un generador de nmeros aleatorios que es ms flexible que la funcin esttica random de la clase Math. Para crear una secuencia de nmeros aleatorios tenemos que seguir los siguientes pasos: 1. Proporcionar a nuestro programa informacin acerca de la clase Random. Al principio del programa escribiremos la siguiente sentencia.
import java.util.Random;

2. Crear un objeto de la clase Random 3. Llamar a una de las funciones miembro que generan un nmero aleatorio 4. Usar el nmero aleatorio. Constructores La clase dispone de dos constructores, el primero crea un generador de nmeros aleatorios cuya semilla es inicializada en base al instante de tiempo actual.
Random rnd = new Random();

El segundo, inicializa la semilla con un nmero del tipo long.


Random rnd = new Random(3816L);

El sufijo L no es necesario, ya que aunque 3816 es un nmero int por defecto, es promocionado automticamente a long. Aunque no podemos predecir que nmeros se generarn con una semilla particular, podemos sin embargo, duplicar una serie de nmeros 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 nmeros aleatorios. Esto no es til en el caso de loterias, pero puede ser til en el caso de juegos, exmenes 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, etc.

Funciones miembro Podemos cambiar la semilla de los nmeros aleatorios en cualquier momento, llamando a la funcin miembro setSeed.
rnd.setSeed(3816);

Podemos generar nmeros aleatorios en cuatro formas diferentes:


rnd.nextInt();

genera un nmero aleatorio entero de tipo int


rnd.nextLong();

genera un nmero aleatorio entero de tipo long


rnd.nextFloat();

genera un nmero aleatorio de tipo float entre 0.0 y 1.0, aunque siempre menor que 1.0
rnd.nextDouble();

genera un nmero aleatorio de tipo double entre 0.0 y 1.0, aunque siempre menor que 1.0 Casi siempre usaremos esta ltima versin. Por ejemplo, para generar una secuencia de 10 nmeros aleatorios entre 0.0 y 1.0 escribimos
for (int i = 0; i < 10; i++) { System.out.println(rnd.nextDouble());; }

Para crear una secuencia de 10 nmeros aleatorios enteros comprendidos entre 0 y 9 ambos includos escribimos
int x; for (int i = 0; i < 10; i++) { x = (int)(rnd.nextDouble() * 10.0); System.out.println(x); }

(int) transforma un nmero decimal double en entero int eliminando la parte decimal.

Clase Timer
Java nos proporciona dos clases distintas que nos ayudan a esta tarea. Son las clases javax.swing.Timer y java.util.Timer. A ambas clases les decimos cada cunto queremos el aviso (por ejemplo, un aviso cada segundo en el caso del reloj) y ellas se encargan de llamar a un mtodo que nosotros hayamos implementado. El resultado es que ese mtodo (el que pinta el segundero en la pantalla), se llamar cada cierto tiempo (una vez por segundo en el caso del reloj). javax.swing.Timer Esta clase es ms sencilla de usar. Basta con instanciarla pasndole cada cunto tiempo (en milisegundos) queremos que nos avise y un ActionListener, cuyo mtodoactionPerformed() se ejecutar peridicamente. Luego slo hay que llamar al mtodo start() cuando queramos que el Timer empiece a contar. El cdigo puede ser similar a este:
Timer timer = new Timer (tiempoEnMilisegundos, new ActionListener () { public void actionPerformed(ActionEvent e) { // Aqu el cdigo que queramos ejecutar. } }); ... timer.start();

Tenemos tambin el mtodo stop() para parar el Timer, setRepeats(boolean) para hacer que sea repetitivo o no, etc, etc. Bueno, no es cuestin de poner aqu toda la API de java. java.util.Timer Esta clase es ms general, tiene ms opciones, pero es algo ms compleja de usar. Para arrancarlo hay que llamar a alguno de los mtodos schedule(). No voy a detallarlos todos porque para eso est la API, pero nos dan bastantes posibilidades. Podemos decirle cosas complejas, como por ejemplo, que "a partir del 22 de febrero de 2007, a las 17:00 empieza a darme avisos cada 5 minutos", o bien podemos decirle cosas sencillas, como "avsame una sola vez dentro de 5 minutos". Dentro de los avisos repetitivos hay incluso dos opciones.

Con los mtodos schedule(), si por ejemplo, el aviso es repetitivo cada segundo, es posible que el ordenador est bastante ocupado haciendo otras cosas, con lo que el aviso nos puede llegar con un cierto retraso. Con esta opcin el retraso se acumula de una llamada a otra. Si el ordenador est muy atareado y nos da avisos cada 1.1 segundos en vez de cada 1, el primer aviso lo recibimos en el segundo 1.1, el segundo en el 2.2, el tercero en el 3.3, etc, etc. Si hacemos nuestro reloj de esta forma, coger adelantos o retrasos importantes en poco tiempo. La otra opcin son los mtodos scheduleAtFixedRate(). Con estos mtodos los avisos son relativos al primer aviso, de esta forma, si hay retraso en un aviso, no influye en cuando se produce el siguiente. Igual que antes, si el ordenador est muy ocupado y da avisos cada 1.1 segundos en vez de cada segundo, el primer aviso se recibir en el segundo 1.1, el segundo en el 2.1, el tercero en el 3.1, etc. El retraso no se va acumulando. Est claro que para hacer un reloj, como es nuestro ejemplo, debemos usar la segunda forma (mtodosscheduleAtFixedRate() en vez de schedule()).

Para el ejemplo de nuestro reloj, se crea el Timer instancindolo con un constructor sin parmetros. Luego debemos llamar al mtodo scheduleAtFixedRate(). A este mtodo hay que pasarle tres parmetros:

Una clase TimerTask. Dicha clase tiene un mtodo run() (Puesto que TimerTask es una clase abstracta, debemos hacer una clase hija de ella e implementar el mtodo run()) y que es al que se llamar cada cierto tiempo. Ah debemos poner nuestro cdigo. Usaremos la versin del mtodo en el que el segundo parmetro es un long, que es a partir de cuntos milisegundos queremos que empiece a avisarnos. Si ponemos cero, empezar a avisarnos inmediatamente. Como tercer parmetro lleva otro long, que es cada cuntos milisegundos queremos recibir el aviso.

S-ar putea să vă placă și