Set seed on Math.random()

2020-07-07 03:09发布

I need to write some junit tests on Java code that calls Math.random(). I know that I can set the seed if I was instantiating my own Random object to produce repeatable results. Is there a way to do this also for Math.random() ?

3条回答
祖国的老花朵
2楼-- · 2020-07-07 03:38

Set it with instance of Random with your seed or just extend the methods to return values you need

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

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

        });
查看更多
相关推荐>>
3楼-- · 2020-07-07 03:41

How about creating an instance of Random yourself and using that instead? Math.random() creates one and uses that, so I don't think that you can mess with its seed. If you create a Random and use it directly, however, you can set the seed for that when you create it, and/or you can call setSeed() on it later.

查看更多
4楼-- · 2020-07-07 03:55

The method Math.random() uses a private static field:

private static Random randomNumberGenerator;

If you really really need to set this to a new Random(CONSTANT_SEED) (for instance you need to JUNit test code which you have no control over) you could do so by using reflection.

查看更多
登录 后发表回答