GENERACIÓN DE NÚMEROS ALEATORIOS EN JAVA

La clase Random proporciona un generador de números aleatorios. Es más flexible que la función random de la clase Math. Vamos a ver un repaso de uso de la clase Random con ejemplos y ejercicios resueltos. La generación de números aleatorios adquiere gran relevancia para un programador, pudiendo tener distintas aplicaciones como:

  1. Construcción preliminar de programas, en los que a falta de datos definitivos, introducimos datos aleatorios.
  2. Simulación de procesos aleatorios (número resultante de tirar un dado, elección de un color por parte de una persona, número premiado en un sorteo de lotería, cantidad de personas que entran a un supermercado en una hora…)
  3. Verificación de programas, y en particular lo que en verificación de algoritmos se conoce como verificación aleatoria (probar el programa con distintos supuestos aleatorios).
  4. Otras aplicaciones.

Pasos sintácticos a emplear para crear una secuencia de números aleatorios:

  1. Proporcionar a nuestro programa información acerca de la clase Random. Al principio del programa escribiremos la siguiente sentencia:
import java.util.Random;
  1. Crear un objeto de la clase Random: la clase Random dispone de dos constructores, para crear un objeto. El primer constructor es:
Random  rnd = new Random();

Este constructor crea un generador de números aleatorios cuya semilla es inicializada automáticamente, en base al tiempo actual. Esto conlleva que en cada ejecución la semilla cambie, es decir, que la secuencia de números aleatorios que se genera en cada ejecución siempre será diferente.

El segundo constructor es:

Random rnd = new Random(inicializar_semilla);

Este constructor nos permite inicializar la semilla manualmente con un número entero cualquiera. Si este número es el mismo en cada ejecución, la secuencia de números aleatorios que se genera en cada ejecución será igual.

  1. Llamar a una de las funciones miembro que generan un número aleatorio:

Lo más habitual, para generar un número aleatorio, es usar la función miembro rnd.nextDouble(). El valor devuelto es de tipo double. Un aspecto importante a tener en cuenta, es que el valor devuelto se encuentra en el rango mayor o igual a cero y menor a 1. Es decir, el número devuelto puede ser cero pero no puede ser uno.

    /* Ejemplo uso clase Random() */
    import java.util.Random;
    public class Programa {
        public static void main(String arg[ ]) {
              Random rnd = new Random();
              System.out.println("Número aleatorio real entre [0,1[ : "+rnd.nextDouble());
         }
    }

En el caso de necesitar números aleatorios enteros en un rango determinado, podemos trasladarnos a un intervalo distinto, simplemente multiplicando, aplicando la siguiente fórmula general:

(int) (rnd.nextDouble() * cantidad_números_rango + término_inicial_rango)

donde (int) al inicio, transforma un número decimal double en entero int, eliminando la parte decimal.

VALOR ABSOLUTO DE UN NÚMERO EN JAVA

DESCRIPCIÓN DEL MÉTODO Math.abs()

Método que nos permite calcular el valor absoluto de un número.

SINTAXIS

public static double abs(double a)

public static float abs(float a)

public static int abs(int a)

public static long abs(long a)

PARAMETROS

a, valor numérico al que se necesita calcular el valor absoluto.

EXCEPCIONES

Clase Java a la que aplica

EJEMPLO

// Si queremos |-3|

System.out.println(Math.abs(-3));

BIBLIOTECAS DE JAVA

Java lleva a un nuevo nivel el concepto de bibliotecas o paquetes, éstos proveen una amplia funcionalidad para crear nuevas aplicaciones de Java. Además de servir como bibliotecas, definen una Application Program Interface(API) [interface de aplicación de programa], que permite al desarrollador extender las clases de estos paquetes para adaptarlos a las necesidades básicas de un programa. Java organiza estos paquetes en componentes jerárquicos a partir de dos directorios principales. El primero es java, que es parte esencial de lo que actualmente se conoce como el API 1 de Java.

1.PNG

En la actualidad se cuenta con el API 2 de Java, mejor conocido como Java2, el cual incluye además del paquete java, el paquete javax, donde se encuentran componentes más avanzados, como se muestra en la tabla 5.2.

2.PNG

En Java, cada clase debe ser parte de un paquete (package), y puede ser referida por su nombre completo “calificado”, el cual consiste en la jerarquía del paquete y el nombre de la clase, todos separados por puntos. Los propios nombres de los paquetes generalmente están compuestos de múltiples componentes separados por puntos. Por ejemplo, la clase PixelGrabber que se encuentra en el paquete java.awt.image se ingresaría mediante:

java.awt.image.PixelGrabber

Vale la penar notar que los paquetes se guardan en distintos directorios, donde el “.” realmente corresponde a “/” (“\” en la PC), donde se traduce, por ejemplo java.awt.image a java/awt/image. Por tanto, la clase PixelGrabber estaría guardada dentro del directorio anterior.

Además de los paquetes mencionados en las tablas 5.1 y 5.2, existe un número muy extenso de productos adicionales desarrollados por Sun y otras compañías, como los paquetes para gráficas en dos y tres dimensiones que son también parte de Java, y los paquetes para acceso a bases de datos de Oracle y Sybase.

Gale Virtual Reference Library – Documento – Introducción a JavaWeitzenfeld, Alfredo. “Introducción a Java.” Ingeniería de Software Orientada a Objetos con UML, Java e Internet, Cengage Learning, 2005, pp. [129]-134. Gale Virtual Reference Library, bibliotecavirtual.unad.edu.co:2081/ps/i.do?p=GVRL&sw=w&u=unad&v=2.1&it=r&id=GALE%7CCX3004300042&asid=81fb1d420e8abce85922ab918a53efa4. Accessed 6 Mar. 2017.

EJECUCIÓN EN JAVA

Durante la ejecución se obtiene el bytecode, guardado en los archivos “.class”, que puede estar ya en la plataforma actual o haber sido enviado por la red, como en el caso de un browser. El bytecode se carga en la máquina virtual por el cargador de clases. A continuación este código es procesado por el verificador de bytecode y, dependiendo del hardware con que se cuenta, puede ser interpretado y ejecutado por el procesador virtual de la máquina o traducido al código de un procesador de Java mediante el generador de código.

► Existen dos maneras de ejecutar (y estructurar) un programa dependiendo de su ambiente de ejecución. En el caso de una aplicación “normal” (standalone), se ejecuta mediante el siguiente interpretador de Java, llamado simplemente java:

java ej2

► En el caso de una aplicación que se ejecuta desde un navegador web (web browser), llamado applet, el contenido de los archivos .class que están almacenados en el servidor, se transmiten a través de la red y se ejecutan en la máquina cliente (que puede ser la misma máquina que el servidor). Dado que un browser sólo comprende archivo .html, el applet debe ser relacionado con un archivo llamado, por ejemplo ej.html. Este archivo debe contener la siguiente línea:

<applet code=ej.class width=200 height=200></applet>

Ya que pueden haber múltiples archivos .class, sólo el principal es el que se incluye en la línea anterior. Otra forma adicional de ejecutar el applet es mediante el comando appletviewer, de la siguiente forma:

appletviewer ej.html 

Gale Virtual Reference Library – Documento – Introducción a JavaWeitzenfeld, Alfredo. “Introducción a Java.” Ingeniería de Software Orientada a Objetos con UML, Java e Internet, Cengage Learning, 2005, pp. [129]-134. Gale Virtual Reference Library, bibliotecavirtual.unad.edu.co:2081/ps/i.do?p=GVRL&sw=w&u=unad&v=2.1&it=r&id=GALE%7CCX3004300042&asid=81fb1d420e8abce85922ab918a53efa4. Accessed 6 Mar. 2017.

COMPILACIÓN EN JAVA

Se escribe un programa en código Java utilizando el sufijo “.java”, el cual se compila mediante cualquiera de los compiladores de Java en alguna de las distintas plataformas. En general, debe haber un archivo “.java” por cada clase que exista en el programa, donde el archivo tendrá el mismo nombre que la clase contenida. El compilador genera el código final, conocido como bytecode, a ser interpretado por la máquina virtual de Java. El programa generado tiene como extensión el sufijo “.class”. Se origina un archivo “.class” por cada clase que se tenga en la aplicación.

Por ejemplo, si se tiene una clase llamada “ej”, el nombre del archivo debe ser “ej.java”. El archivo se compilaría mediante algún ambiente de desarrollo o utilizando el comando javac que viene incluido en los kit de desarrollo de Java como Java Development Kit (JDK) o Standard Development Kit (SDK). Por ejemplo, para compilar el archivo anterior se ejecutaría

javac ej.java

Esta compilación resultaría en el archivo “ej.class”.

Gale Virtual Reference Library – Documento – Introducción a JavaWeitzenfeld, Alfredo. “Introducción a Java.” Ingeniería de Software Orientada a Objetos con UML, Java e Internet, Cengage Learning, 2005, pp. [129]-134. Gale Virtual Reference Library, bibliotecavirtual.unad.edu.co:2081/ps/i.do?p=GVRL&sw=w&u=unad&v=2.1&it=r&id=GALE%7CCX3004300042&asid=81fb1d420e8abce85922ab918a53efa4. Accessed 6 Mar. 2017.

JAVA

El lenguaje de Java tiene características que lo han hecho un lenguaje esencial para la programación de sistemas de cómputo, que consta de los siguientes puntos:

► Orientado a objetos. Ante todo Java es un lenguaje orientado a objetos, lo cual lo pone en la misma categoría que lenguajes como C++ y Smalltalk. Como parte de esta característica, se cuenta con un ligado dinámico (dynamic linkage) de clases en tiempo de ejecución, herencia y polimorfismo; además de aspectos de metanivel similares a los de Smalltalk.

► Portátil. Un aspecto que ha hecho de Java un lenguaje muy utilizado es su portabilidad. A diferencia de lenguajes como C y C++, que varían en su detalle dependiendo de la máquina en que se ejecuten, Java es exactamente igual en cualquier plataforma. Por ejemplo, a diferencia de C y C++, el tamaño de los tipos de datos en Java es fijo, independiente de la máquina. La importancia de este aspecto es que si se compila el programa en una plataforma particular, el sistema correrá en cualquier máquina, reduciendo mucho el costo de desarrollo (tiempo y dinero). Para ello, está el concepto de la máquina virtual de Java (Java Virtual Machine, JVM), que debe existir en cada plataforma donde se ejecute un programa de Java.

► Abierto. Este aspecto de portabilidad ocurre gracias a su diseño abierto, que permite a cualquier compañía, e incluso desarrollador, tomar el código fuente, para adaptarlo a una nueva plataforma donde aún no se ha probado. Ninguno de los demás lenguajes ofrecen esta característica. Otra razón de la gran popularidad de Java.

► Gratis. Muy de la mano con el aspecto “abierto” está que el lenguaje se ofrece gratis, aunque bajo licencia, a cualquier usuario. Esto reduce el costo de la aplicación y fortalece la decisión de utilizarlo en distintas plataformas, donde no se incurre en el costo de pagar gran número de licencias, como es obligatorio en la mayoría de los demás productos.

► Integrado a la web. Éste es uno de los aspectos que ha impulsado la gran difusión de Java, en una época donde la Internet ha sido de crucial importancia. Java es el único lenguaje, con excepción de algunos lenguajes scripts, que viene integrado con los navegadores (browsers) más utilizados en la Web.

► Simple. Otro aspecto es su similitud con C y C++, en relación con las expresiones básicas del lenguaje. Esto ha permitido a los programadores aprender Java de manera más rápida, a diferencia de lenguajes como Smalltalk que requieren un cambio en la manera de pensar de los programadores ya acostumbrados a C y C++. Sin embargo, Java se considera más puro que C++, ya que no contiene más que clases, lo que simplifica el programa y al propio compilador. Java disminuye la complejidad de C++, como es la aritmética de apuntadores, que a su vez agrega complejidad a la administración de memoria. Se elimina la complejidad adicional de tipos como estructuras y el uso de asociaciones de tipo, a través de typedefs, junto con el preprocesa-dor de C++ con palabras reservadas como #define, #include y #ifdef. Otro aspecto que se elimina es la sobreescritura de operadores. También se eliminan aspectos de manejo complicado como la herencia múltiple.

► Robusto. En contraste con C++ y, en especial, con C, Java está fuertemente tipificado, lo que ayuda a encontrar con mayor facilidad los errores de programación durante la etapa de compilación. Java también incluye manejo de excepciones y recolección de basura, con objeto de lograr programas más robustos.

► Seguro. Debido a la eliminación de los apuntadores de C y C++, Java logra un modelo de manejo de memoria mucho más seguro, que además se apoya en el modelo de verificación de código en tiempo de ejecución, como veremos más adelante en la descripción del modelo completo de Java.

► Eficiencia. En la actualidad, Java está considerado como un lenguaje eficiente. Aunque nunca llegue a la eficiencia de C, en este aspecto se le compara con C++. Esta eficiencia se basa en que cuenta con un compilador para generar el código en contraste con aquellos lenguajes completamente interpretados, donde el rendimiento es menor. Ahora Java cuenta con un compilador incremental (Just-in-Time Compiler, JIT), que ayuda a lograr estos objetivos.

► Bibliotecas. Otro aspecto que ha hecho de Java un lenguaje muy aceptado es la riqueza de sus bibliotecas o paquetes (package). Esto está en contraste radical con C y C++, donde las bibliotecas realmente no existen. En cambio Java contiene un gran número de bibliotecas que facilitan la creación de programas, además de asegurar una estandarización entre aplicaciones. Existen bibliotecas para el manejo de estructuras de datos avanzadas, manejo de multimedia, manejo de redes como TCP/IP, procedimientos remotos y concurrencia mediante múltiples hilos de procesamiento (múltiple threads), estos últimos también conocidos como procesos finos o livianos. En la actualidad, aprender el lenguaje de Java como tal es sólo 10% del esfuerzo, 90% restante se enfoca a aprender a utilizar sus bibliotecas. Obviamente se estudian sólo aquellas que se desea conocer. Por ejemplo, una biblioteca importante es la del sistema de ventanas que puede correr bajo cualquier plataforma. Existe el Abstract Window Toolkit (AWT) desde la primera versión de Java, y se cuenta en la actualidad con las bibliotecas Java Foundation Classes (JFC), también conocidas como SWING. Además de éstas existen bibliotecas de manejo de gráficas en dos y tres dimensiones. Incluso existen versiones para correr en plataformas móviles, como asistentes personales.

► Tecnología. Existe un gran número de productos y tecnología desarrollados alrededor de Java. Aparte de este lenguaje se cuenta con productos tales como Enterprise JavaBeans (EJB), Java Server Pages (JSP), Java Servlets y Java Data Base Connectors (JDBC). Además, existen productos relacionados con estándares tales como Common Object Request Brower Architecture (CORBA) y extended Markup Language (XML). En la actualidad hay tres ediciones principales Java: Java2 Enterprise Edition (J2EE), Java2 Standard Edition (J2SE) y Java2 Micro Edition (J2ME).

Weitzenfeld, Alfredo. “Introducción a Java.” Ingeniería de Software Orientada a Objetos con UML, Java e Internet, Cengage Learning, 2005, pp. [129]-134. Gale Virtual Reference Library, bibliotecavirtual.unad.edu.co:2081/ps/i.do?p=GVRL&sw=w&u=unad&v=2.1&it=r&id=GALE%7CCX3004300042&asid=81fb1d420e8abce85922ab918a53efa4. Accessed 6 Mar. 2017.