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