使用种子的Java随机数

Rah*_*tia 44 java random seed

这是我使用种子作为参数生成随机数的代码:

double randomGenerator(long seed) {
    Random generator = new Random(seed);
    double num = generator.nextDouble() * (0.5);

    return num;
}
Run Code Online (Sandbox Code Playgroud)

每次我给种子并尝试生成100个数字时,它们都是相同的.
我怎样才能解决这个问题?

Den*_*ret 73

如果你给的是相同的种子,这是正常的.这是允许测试的重要特征.

检查这一点以了解伪随机生成和种子:

伪随机数发生器

伪随机数发生器(PRNG),也称为确定性随机比特发生器DRBG,是用于生成近似随机数的属性的数字序列的算法.该序列不是真正随机的,因为它完全由一组相对较小的初始值确定,称为PRNG的状态,其中包括真正的随机种子.

如果你想拥有不同的序列(通常不调整或调试算法的情况),你应该调用零参数构造函数,它使用nanoTime每次尝试获取不同的种子.Random当然,这个实例应该保留在您的方法之外.

你的代码应该是这样的:

private Random generator = new Random();
double randomGenerator() {
    return generator.nextDouble()*0.5;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用“new Random()”是等效的或更好的参见源代码:public Random() { this(seedUniquifier() ^ System.nanoTime()); } (4认同)
  • @kukis没关系。这只是一个在每次**程序**启动时都不相同的数字。因为你的程序只设置种子一次。 (2认同)

小智 21

简单的方法是使用:

Random rand = new Random(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)

这是生成Random数字的最佳方式.

  • 在特殊情况下,当代码运行速度太快时,可以从相同的种子开始 (2认同)

duf*_*ymo 12

您不应该在方法范围中创建新的Random.使其成为班级成员:

public class Foo {
   private Random random 

   public Foo() {
       this(System.currentTimeMillis());
   }

   public Foo(long seed) {
       this.random = new Random(seed);
   }

   public synchronized double getNext() {
        return generator.nextDouble();
   }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个例子.我认为以Random这种方式包装不会增加任何价值.把它放在你正在使用它的一类中.

  • 它似乎无关,因为它似乎只是一个重构,但它肯定是相关的.每次调用方法时,OP都会重新实例化Random生成器,因此`nextDouble`将始终在随机序列中返回_first_ double.这个答案只实例化了一次Random生成器,并且每次调用`getNext`时,它实际上都会逐步执行随机序列并每次返回一个不同的数字. (5认同)

JB *_*zet 6

这就是 -RNG 的原理.这些数字并不是随机的.它们是使用确定性算法生成的,但是根据种子,生成的数字序列会有所不同.由于您始终使用相同的种子,因此始终获得相同的序列.