gentoo linux, java, software libre y otras hierbas
Jul, 31 2007 - 7:18 pm

Aclaración: Generar números aleatorios en Java con la clase Random

Antes que nada, veamos un pequeño ejemplo del uso de la clase Random, para ver su funcionamiento básico:

import java.util.*;
public class NumerosAleatorios
{
public static void main(String args[])
{
Random r=new Random();
r.setSeed(123456789);
System.out.println(r.nextInt(1000));
}
}

Como puedes observar, después de crear el objeto Random, es necesario utilizar el método setSeed(long) para establecer la semilla a partir de la cual se generarán números aleatorios (pseudo-aleatorios)… fíjate como le pasamos un número(que puede ser cualquiera, en formato long logicamente [obviando o no el sufijo L]), que representará la semilla.

Lo primero que es necesario entender, es que con la clase Random se generan números pseudo-aleatorios, por tal motivo siempre que corras el programa te va a salir exactamente el mismo número aleatorio o la misma secuencia (a menos de que se cambie la semilla). Esto se puede observar en el propio método setSeed:

synchronized public void setSeed(long seed) {
this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
haveNextNextGaussian = false;
}

Entonces… ¿cuál es la solución para generar números realmente aleatorios con la clase Random? El método más sencillo para hacer esto, es insertar un valor en la semilla (en el método setSeed) que cambie cada vez que se ejecute el programa, y el más adecuado es la hora. Por obvios motivos, cada vez que ejecutas un programa la hora y fecha ha cambiado, entonces podemos usar nuestro programa de la siguiente forma:

import java.util.*;
public class aleatorio
{
public static void main(String args[])
{
Random r;
r=new Random();
r.setSeed(new Date().getTime());
System.out.println(r.nextInt(1000));
}
}

De ésta manera la semilla cambiará cada vez que ejecutemos el programa.

6 Comentarios | deja el tuyo

Jul, 31 2007 - 10:36 am

Pronto habrán cambios

Como la mayoría de ustedes ya habrá notado, el diseño actual de este blog (en comparación con los anteriores) es un poco cutre… bueno, no nos digamos mentiras es verdaderamente feo, pero lastimosamente no he tenido tiempo de jugar un poco con eso.

Lo primero será buscarle un look más atractivo, hoy comienzo a buscar temas haber que encuentro… lo segundo será organizar las secciones mejor, ya que solo con las etiquetas no basta.

Todo esto por haber comprado el dominio, ya que tambien he perdido bastantes visitas a comparación del antiguo blog. Bueno, todo con calma y con buena fe… se aceptan sugerencias.

Un saludo!

8 Comentarios | deja el tuyo

Jul, 27 2007 - 8:00 pm

Repasando RMI

JavaHace bastante tiempo (cuando tenía algo de tiempo), escribi algo sobre RMI y daba un pequeño ejemplo muy simple. Ya bastante gente que ha leído el post, me han hecho preguntas y casualmente la mayoría son del tipo: “quiero hacer que el servidor RMI procese algo, y lo decuelva al cliente”. Esto me hace pensar que talvez no me he hecho entender.

Repasando: el RMI (Remote Method Invocation), permite a una aplicación en Java ejecutar un método (una función), que se encuentra en otra clase ejecutandose en otra máquina. En este caso, la calse que implementa el método es llamada servidor, y la clase que ejecuta dicho método es el cliente. Lo que es importante aclarar es que al usar RMI e invocar un método remoto, la lógica funciona igual que cualquier invocación de un método”local”. Por lo tanto la función que se declare en el servidor, puede tener cualquier tipo de valor de retorno (o void si no se retorna nada); repito: se comporta exactamente igual que si ejecutaramos una función de la misma clase en el mismo equipo.

La confusión talvez se dió porque el ejemplo que pongo es demasiado sencillo, y en el solo se ejecuta un método vacío en el servidor. En este que sigue ya se puede ver más claramente el funcionamiento pleno del RMI:

Descargar código fuente de los ejemplos

3 Comentarios | deja el tuyo

« Entradas anteriores