2010-05-14 42 views
8

Necesito escribir algunas pruebas junit en el código Java que llama al Math.random(). Sé que puedo establecer la semilla si estaba instanciando mi propio objeto aleatorio para producir resultados repetibles. ¿Hay alguna manera de hacer esto también para Math.random()?Establecer semilla en Math.random()

Respuesta

12

El método Math.random() utiliza un campo estático privado:

private static Random randomNumberGenerator; 

Si realmente necesita fijar a un new Random(CONSTANT_SEED) (por ejemplo, usted necesita el código de prueba JUnit que no tiene control sobre) se podría hacerlo usando reflection.

+5

Cómo es posible elaborar en la parte reflejo de su respuesta por favor regrese? –

9

¿Qué le parece crear una instancia de Random y usar eso en su lugar? Math.random() crea uno y lo usa, así que no creo que puedas meterse con su semilla. Sin embargo, si creas un Random y lo usas directamente, puedes establecer la semilla para eso cuando lo crees, y/o puedes llamar al setSeed() más tarde.

2

Conjunto con instancia de azar con su semilla o simplemente extender los métodos a los valores que necesita

 Field field = Math.class.getDeclaredField("randomNumberGenerator"); 
     field.setAccessible(true); 
     field.set(null, new Random() { 

      @Override 
      public double nextDouble() { 
       return 1; 
      } 

     }); 
+0

¡La versión canónica de random debe devolver 4! –

Cuestiones relacionadas