java随机数种子_使用种子的Java随机数

使用种子的Java随机数

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

double randomGenerator(long seed) {

Random generator = new Random(seed);

double num = generator.nextDouble() * (0.5);

return num;

}

每次我提供种子并尝试生成100个数字时,它们都是相同的。

我怎样才能解决这个问题?

7个解决方案

73 votes

如果您给相同的种子,那是正常的。 这是允许测试的重要功能。

选中此选项可了解伪随机生成和种子:

伪随机数发生器

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

如果要具有不同的序列(通常在不调整或调试算法时使用),则应调用零参数构造函数,该构造函数使用nanoTime尝试每次获取不同的种子。 当然,此Random实例应保留在您的方法之外。

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

private Random generator = new Random();

double randomGenerator() {

return generator.nextDouble()*0.5;

}

Denys Séguret answered 2020-07-12T12:24:02Z

21 votes

简单的方法是使用:

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

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

Pollar answered 2020-07-12T12:24:27Z

11 votes

您不应该在方法范围内创建新的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();

}

}

这仅仅是一个例子。 我认为这样包装Random不会增加任何价值。 将其放在正在使用的类中。

duffymo answered 2020-07-12T12:24:51Z

6 votes

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

JB Nizet answered 2020-07-12T12:25:11Z

2 votes

问题在于您再次为随机生成器添加了种子。 每次播种时,都会重置随机数生成器的初始状态,并且生成的第一个随机数将是初始状态之后的第一个随机数

Minion91 answered 2020-07-12T12:25:31Z

2 votes

如果要使用一个种子生成多个数字,可以执行以下操作:

public double[] GenerateNumbers(long seed, int amount) {

double[] randomList = new double[amount];

for (int i=0;i

Random generator = new Random(seed);

randomList[i] = Math.abs((double) (generator.nextLong() % 0.001) * 10000);

seed--;

}

return randomList;

}

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

user5479540 answered 2020-07-12T12:25:56Z

1 votes

这里的几个示例创建了一个新的ThreadLocalRandom实例,但这不是必需的。 也没有理由像一种解决方案一样使用synchronized。 相反,请利用ThreadLocalRandom类上的方法:

double randomGenerator() {

return ThreadLocalRandom.current().nextDouble(0.5);

}

Finn answered 2020-07-12T12:26:18Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值