===== siette.uti.Random ==== La clase siette.util.Random emula una extension de la clase [[https://docs.oracle.com/javase/8/docs/api/java/util/Random.html|java.util.Random]], pero permite redefinir os constructores de manera que todos los objetos creados a partir de esta clase compartan la misma semilla. Esto permite reproducir exactamente las instacias de preguntas generadas, con solo guardar la semilla, siempre y cuando no haya habido modificaciones en el orden de generación de números aleatorios. El objetivo es que dada una semilla se produzca siempre la misma instancia. Esta clase tiene los siguientes métdos públicos: ==== Constructor ==== public Random() throws RandomException Crea un objeto, en general no es necesario crear el objeto, ya que Siette lo crea internamente y en el código de las preguntas se utilizan métodos //estaticos//. Este método sirve simplemente para devolver una referencia al objeto principal, y para que la programación sea similar a la clase ''java.util.Random''. ==== Semilla ==== public static setSeed(long seed) public static long getSeed() Escribe o lee la semilla del objeto ''Random''. En general no es necesario utilizar este método, y esta desaconsejando variar la semilla, ya que esto haría que la pregunta no pudiera reproducirse exactamente como se planteo. Son métodos usados por el sistema. ==== boolean ==== public static boolean nextBoolean() Devuelve un valor logico aleatoriamente (''true'' o ''false'') ==== double ==== public static double nextDouble() Devuelve un número real de tipo ''double'' con una distribución uniforme entre 0 y 1. public static double nextDouble(double min, double max, double step, String format) public static double nextDouble(double min, double max, String format) public static double nextDouble(double min, double max, double step) public static double nextDouble(double min, double max) Devuelve un número real de tipo ''double'' con una distribución uniforme entre ''min'' y ''max'' (ambos inclusive). Si se añade un argumento ''step'' los valores que se generan serán siempre valores exactos que se obtienen añadiendo aleratoriamente a ''min'' un multiplo de ''step''. Por ejemplo int x = Random.nextDouble(0, 2, 0.25); genera aleatoriamente los valores {0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0} Si se añade un argumento ''format'' con la especificación definida en [[https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html|java.text.DecimalFormat]], se sigue devolviendo un número real de tipo ''double'' pero su valor se trunca para encajar con el formato. Por ejemplo int x = Random.nextDouble(0, 2, 1/3, "#.##"); genera aleatoriamente los valores {0.00, 0.33, 0.67, 1.00, 1.33, 1.67, 2.00} public static double nextGausian() Devuelve un número real de tipo ''double'' con una distribución normal de media 0 y desviación típica 1. Los valores centrales tienen mayor probabilidad de ser generados. Se fuerza que todos los valores estén comprendidos entre -1 y 1. public static double nextGausian(double min, double max, String format) public static double nextGausian(double min, double max) Son métodos similares a los que utiliza el método ''nextDouble'' pero utilizando una distribución nnormal de media $(max-min)/2$ y desviación típica proporcional a la anchura del intervalo. En este caso no tiene sentido utilizar el parámetro ''step''. ==== float ==== public static float nextFloat(float min, float max, float step, String format) public static float nextFloat(float min, float max, String format) public static float nextFloat(float min, float max, float step) public static float nextFloat(float min, float max) public static float nextFloat() Son métodos similares a ''nextDouble'', pero devolviendo un número de tipo ''float''. ==== int ==== public static double nextInt(int min, int max, int step, String format) public static double nextInt(int min, int max, String format) public static double nextInt(int min, int max, int step) public static double nextInt(int min, int max) public static double nextInt(int max) public static double nextInt() public static double nextPositiveInt() Son métodos simialres ''nextDouble'', pero con números de tipo ''int''. Si no se especifica el valor ''min'' se toma ''min=0''. Si no se especifica ningún argumento se seleciona un número entero cualquiera entre entre $-2^{31}$ y $2^{31}$ con una distribución uniforme. La última función selecciona solamente números enteros positivos entre 0 y $2^{31}$. ==== long ==== public static double nextLong(long min, long max, long step, String format) public static double nextLong(long min, long max, String format) public static double nextLong(long min, long max, long step) public static double nextLong(long min, long max) public static double nextLong(long max) public static double nextLong() Son métodos similares a ''nextInt'' pero que devuelven números de tipo ''long'' entre $-2^{63}$ y $2^{63}$ con una distribución uniforme. ((Segun la documentación de java, la funcion no devuelve todos los posibles valores de tipo ''long'', ya que la semilla está limitada a 48 bits.)) ==== format ==== public static String format(double value, String format) public static String format(float value, String format) public static String format(long value, String format) public static String format(int value, String format) public static String format10(double value, String format) La función ''format'' llama a la clase [[https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html|java.text.DecimalFormat]] para construir una representación del número ''value'' que se le pasa como argumento. La función ''format10'' crea una represenación en HTML equivalente a la notación cientifica. El atributo ''format'' se aplica solo a la mantisa. Por ejemplo el número la instruccion: String st = Random.format10(299792, "#"); da como resultado 3 x 105 que en HTML se muestra como: 3 x 105 ==== select ==== public static Object select(List list) public static Object select(Set set) public static Object select(Object[] obj) public static String select(String[] obj) public static double select(double[] obj) public static float select(float[] obj) public static long select(long[] obj) public static int select(int[] obj) Las funciones ''select'' sirven para seleccionar un objeto al azar a partir de una colección de objetos, ya sea una lista, un conjunto o un array de elementos. Por ejemplo: String color = Random.select(new String[] {"rojo","azul","verde","amarillo"}); selecciona aletoriamente una cadena de caracteres que representa uno de estos cuatro colores. ==== Barajar y permutar ==== public static List shuffle(List list) public static Object[] shuffle(Object[] obj) public static String[] shuffle(String[] obj) public static double[] shuffle(double[] obj) public static float[] shuffle(float[] obj) public static long[] shuffle(long[] obj) public static int[] shuffle(int[] obj) Estas funciones devuelven un objeto igaul que el que reciben pero con los elementos en un orden aleatorio Por ejemplo, la isntruccion: int nums = {0,1,2,3,4,5,6,7,8,9} nums = Random.shuffle(nums); hace que el valor de la variable ''nums'' cambie a: 4,6,2,7,8,3,0,9,1,5 public static int[] permutation(int n) La funcion''permutacion'' hace exactamente lo mismo que barajar en el ejemplo anterior, pero solo hay que indicarle el numero de valores enteros que se desea permutar. Es decir, para obtener el mismo resultado que el ejemplo anterior bastaria con utilizar la llamada a la funcion: int nums = Random.permutacion(9); ==== Otras funciones ==== public static String code(int n) Devuelve un array de //n// caracteres aleatorio. public static Object[] toObjectArray(List list) Transforma una lista en un array de objetos. public static List toList(Object[] list) Transforma un array de objetos en una lista de objetos.