使用种子的Java随机数

这是我的代码,以种子为参数生成随机数:

doublerandomgenerator (长种子) {

Randomgenerator=newRandom(seed );

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

return num;

}

每次我提供种子,试图生成100个数字,它们都是一样的。

怎样才能解决这个问题?

7个解决方案

73 votes

如果给你同样的种子,那就正常了。 这是允许测试的重要功能。

选择此选项可调查伪随机生成和种子。

伪随机数发生器

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

如果不调整或调试算法时使用的序列不同,则必须调用零参数构造函数,每次尝试使用nanoTime获取不同的种子。 当然,这个Random实例应该保留在方法之外。

代码可能与以下内容类似:

privaterandomgenerator=new random (;

双随机生成器

返回generator.next double (* 0.5;

}

denysguretanswered 2020-07-12t 12336024336002 z

21 votes

简单的方法如下

random rand=new random (system.current time millis () );

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

pollaranswered 2020-07-12t 12:24336027 z

11 votes

不应该在方法的范围内创建新的Random。 成为类的成员:

公共类foo {

私有随机随机

公共foo () }

系统. current time millis (this ) );

}

公共foo (long seed ) {

this.Random=newRandom(seed );

}

publicsynchronizeddoublegetnext (

return generator.nextDouble (;

}

}

这只是一个例子。 我觉得这样打包Random不会增加任何价值。 放入正在使用的类中。

duffymoanswered 2020-07-12t 12336024336051 z

6 votes

这就是伪RNG的原理。 这些数字真的不是随机的。 它们使用确定性算法生成,但根据种子的不同,生成数字的顺序也不同。 因为总是使用相同的种子,所以总是得到相同的序列。

jbnizetanswered 2020-07-12t 12336025336011 z

2 votes

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

minion 91 answered 2020-07-12t 12336025336031 z

2 votes

要使用单个种子生成多个数值,请执行下列操作:

公共双精度[ ] generate numbers (long seed,int amount ) {

double [ ] random list=new double [ amount ];

for(intI=0; I

Randomgenerator=newRandom(seed );

randomlist[I]=math.ABS () double ) (generator.nextLong ) % 0.001 ) * 10000 );

SEED—-;

}

return randomList;

}

如果使用相同的种子,则会显示相同的列表。

user 5479540 answered 2020-07-12t 12336025336056 z

1 votes

在这里的几个例子中,我们创建了一个新的ThreadLocalRandom实例,但这不是必需的。 也没有理由像解决方案那样使用synchronized。 请改为使用ThreadLocalRandom类的方法。

双随机生成器

returnthreadlocalrandom.current ().nextdouble ) 0.5;

}

Finn answered 2020-07-12t 12:26336018 z