Установить семя на Math.random () - PullRequest
8 голосов
/ 14 мая 2010

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

Ответы [ 3 ]

12 голосов
/ 14 мая 2010

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

private static Random randomNumberGenerator;

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

9 голосов
/ 14 мая 2010

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

2 голосов
/ 19 февраля 2013

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

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

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

        });
...