Java使用种子的随机数

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

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

每次我给一个种子,并尝试产生100个数字,他们都是一样的。
请帮忙。

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

检查这个了解伪随机生成和种子: http : //en.wikipedia.org/wiki/Pseudorandom_number_generator

一个伪随机数发生器(PRNG),也被称为确定性随机位发生器DRBG,是一种用于生成近似于随机数属性的数字序列的algorithm。 这个序列并不是真正的随机的,它完全由一组相对较小的初始值决定的,称为PRNG状态,它包含一个真正的随机种子。

如果你想有不同的序列(通常情况下,不调整或debuggingalgorithm),你应该调用零参数构造函数,它使用nanoTime试图每次获得一个不同的种子。 这个Random实例当然应该保存在你的方法之外。

你的代码应该可能是这样的:

 private Random generator = new Random(); double randomGenerator() { return generator.nextDouble()*0.5; } 

简单的方法是使用:

 Random rand = new Random(System.currentTimeMillis()); 

这是生成Random数字的最佳方法。

这是一个 -RNG的原则。 这些数字并不是真正的随机数。 它们是使用确定性algorithm生成的,但取决于种子,生成的数字的顺序会有所不同。 既然你总是使用相同的种子,你总是得到相同的序列。

你不应该在方法范围内创build一个新的Random。 让它成为class级成员:

 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(); } } 

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

问题是你再次种下随机发生器。 每次种子时,随机数发生器的初始状态将被重置,您生成的第一个随机数将是初始状态之后的第一个随机数

如果你想用一个种子生成多个数字,你可以这样做:

 public double[] GenerateNumbers(long seed, int amount) { double[] randomList = new double[amount]; for (int i=0;i<amount;i++) { Random generator = new Random(seed); randomList[i] = Math.abs((double) (generator.nextLong() % 0.001) * 10000); seed--; } return randomList; } 

如果使用相同的种子,它将显示相同的列表。

这里的几个例子创build一个新的Random实例,但这是不必要的。 一个解决scheme也没有理由使用synchronized 。 相反,利用ThreadLocalRandom类中的方法:

 double randomGenerator() { return ThreadLocalRandom.current().nextDouble(0.5); }