2010-08-27 32 views
5

Referencia: link textde números aleatorios con semilla

No puedo entender la siguiente línea, alguien me puede proporcionar algún ejemplo para la declaración de abajo?

Si se crean dos instancias de Random con la misma semilla, y llamadas se realiza la misma secuencia de procedimiento para cada uno, que va a generar y devolver secuencias idénticas de números

+0

Seguir esa afirmación es bastante sencillo. 'Random r1, r2', crea e inicializa con la misma semilla (ver documentación). Llamar 'siguiente' 5 veces en cada uno. Devolverán la misma secuencia exacta de 5 números "aleatorios". – polygenelubricants

Respuesta

11

Has solicitado que un ejemplo:

import java.util.Random; 
public class RandomTest { 
    public static void main(String[] s) { 
     Random rnd1 = new Random(42); 
     Random rnd2 = new Random(42); 

     System.out.println(rnd1.nextInt(100)+" - "+rnd2.nextInt(100)); 
     System.out.println(rnd1.nextInt()+" - "+rnd2.nextInt()); 
     System.out.println(rnd1.nextDouble()+" - "+rnd2.nextDouble()); 
     System.out.println(rnd1.nextLong()+" - "+rnd2.nextLong()); 
    } 
} 

Ambos Random casos siempre tendrán la misma salida, no importa cuántas veces se ejecuta, sin importar la plataforma o qué versión de Java que utilice:

30 - 30 
234785527 - 234785527 
0.6832234717598454 - 0.6832234717598454 
5694868678511409995 - 5694868678511409995 
8

El generador aleatorio es determinista. Dada la misma entrada a Random y el mismo uso de los métodos en Random, la secuencia de números pseudoaleatorios devueltos a su programa será la misma incluso en diferentes ejecuciones en máquinas diferentes.

Es por eso que es pseudoaleatorio: los números devueltos se comportan estadísticamente como números aleatorios, excepto que pueden predecirse con fiabilidad. Los verdaderos números aleatorios son impredecibles.

2

Los números no son realmente aleatorios, dadas las mismas condiciones de inicio (la semilla) y la misma secuencia de operaciones, se generará la misma secuencia de números. Esta es la razón por la que no sería bueno utilizar la clase Random básica como parte de un código criptográfico o relacionado con la seguridad, ya que un atacante puede determinar qué secuencia se está generando y predecir los números futuros.

Para obtener un generador de números aleatorios que emite valores no deterministas, consulte SecureRandom.

Ver Random number generation, Computational methods en la wikipedia para obtener más información.

0

Con el mismo valor inicial, las instancias separadas de Random devolverán/generarán la misma secuencia de números aleatorios; más en esta aquí: http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Tech/Chapter04/javaRandNums.html

Rubí Ejemplo:

class LCG; def initialize(seed=Time.now.to_i, a=2416, b=374441, m=1771075); @x, @a, @b, @m = seed % m, a, b, m; end; def next(); @x = (@a * @x + @b) % @m; end; end 

irb(main):004:0> time = Time.now.to_i 
=> 1282908389 

irb(main):005:0> r = LCG.new(time) 
=> #<LCG:0x0000010094f578 @x=650089, @a=2416, @b=374441, @m=1771075> 
irb(main):006:0> r.next 
=> 45940 
irb(main):007:0> r.next 
=> 1558831 
irb(main):008:0> r.next 
=> 1204687 
irb(main):009:0> f = LCG.new(time) 
=> #<LCG:0x0000010084cb28 @x=650089, @a=2416, @b=374441, @m=1771075> 
irb(main):010:0> f.next 
=> 45940 
irb(main):011:0> f.next 
=> 1558831 
irb(main):012:0> f.next 
=> 1204687 

Basándose en los valores a/b/m, el resultado será el mismo para una semilla dada. Esto se puede usar para generar el mismo número "aleatorio" en dos lugares y ambos lados pueden depender de obtener el mismo resultado. Esto puede ser útil para el cifrado; aunque obviamente, este algoritmo no es criptográficamente seguro.

3

La clase Random básicamente es un Número Psuedorandom Generador (también conocido como generador de bits aleatorios determinístico) que genera una secuencia de números que aproxima las propiedades de los números aleatorios. Generalmente no es aleatorio, sino determinista, ya que puede ser determinado por pequeños estados aleatorios en el generador (como seed). Debido a la naturaleza determinista, puede generar resultados idénticos si la secuencia de métodos y las semillas son idénticas en 2 generadores.

1

Esto significa que cuando crea el objeto Random (por ejemplo, al comienzo de su programa), es probable que desee comenzar con una nueva semilla.La mayoría de las personas eligen algún valor relacionado con el tiempo, como el número de tics.

El hecho de que las secuencias numéricas sean iguales dado el mismo valor inicial es muy conveniente si desea depurar su programa: asegúrese de registrar el valor inicial y si algo está mal puede reiniciar el programa en el depurador usando ese mismo valor semilla Esto significa que puede reproducir el escenario exactamente. Esto sería imposible si pudiera (podría) usar un verdadero generador de números aleatorios.

Cuestiones relacionadas