2010-05-14 3 views
8

Мне нужно написать некоторые тесты junit на Java-код, который вызывает Math.random(). Я знаю, что я могу установить семя, если я создавал свой собственный объект Random для получения повторяемых результатов. Есть ли способ сделать это также для Math.random()?Установить семя на Math.random()

ответ

12

Метод Math.random() использует закрытый статическое поле:

private static Random randomNumberGenerator; 

Если вы действительно очень нужно установить это в new Random(CONSTANT_SEED) (например, вам нужно JUnit код тест, который вы не имеете никакого контроля над) вас мог бы сделать это, используя отражение.

+5

могли бы вы подробнее остановиться на отражающей части Вашего ответа, пожалуйста? –

9

0 Как создать экземпляр Random и использовать его вместо этого? Math.random() создает одно и использует это, поэтому я не думаю, что вы можете испортить его семя. Однако, если вы создаете Random и используете его напрямую, вы можете установить семя для него при его создании и/или вы можете позвонить по нему setSeed().

2

Установите его с экземпляром Random с потомством вашим или просто расширить методы возвращают значения, нужно

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

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

     }); 
+0

Каноническая версия случайного должна возвращать 4! –

Смежные вопросы