【问题标题】:Set seed on Math.random()在 Math.random() 上设置种子
【发布时间】:2013-12-01 10:54:28
【问题描述】:

我需要对调用Math.random() 的Java 代码编写一些junit 测试。我知道如果我实例化自己的 Random 对象以产生可重复的结果,我可以设置种子。 Math.random() 有没有办法做到这一点?

【问题讨论】:

    标签: java random random-seed


    【解决方案1】:

    Math.random() 方法使用私有静态字段:

    private static Random randomNumberGenerator;
    

    如果您真的需要将此设置为new Random(CONSTANT_SEED)(例如,您需要 JUNit 测试您无法控制的代码),您可以使用 reflection。

    【讨论】:

    • 您能否详细说明您的答案的反思部分?
    • 从 Java 8 开始(或者可能一直是这样),它被隐藏得稍微远了一些——Math 中有一个私有静态 final RandomNumberGeneratorHolder 类,然后拥有一个静态 final Random
    【解决方案2】:

    如何自己创建一个Random 的实例并使用它呢? Math.random() 创建一个并使用它,所以我认为你不能弄乱它的种子。但是,如果您创建 Random 并直接使用它,您可以在创建它时为其设置种子,和/或您可以稍后调用 setSeed()

    【讨论】:

      【解决方案3】:

      用你的种子设置它的随机实例,或者只是扩展方法以返回你需要的值

              Field field = Math.class.getDeclaredField("randomNumberGenerator");
              field.setAccessible(true);
              field.set(null, new Random() {
      
                  @Override
                  public double nextDouble() {
                      return 1;
                  }
      
              });
      

      【讨论】:

      • 随机的规范版本应该返回 4!
      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 2019-10-03
      • 2013-05-22
      • 2012-04-14
      • 1970-01-01
      • 2017-08-10
      • 2011-03-25
      • 1970-01-01
      相关资源
      最近更新 更多