Math.random开始种子

时间:2014-10-24 00:31:54

标签: java

是否可以在Java中包含Math.random方法的起始种子?如果是这样,该陈述会是什么样子?我知道如何在Random类中包含一个起始种子,但是如果我想使用Math.random方法而不是使用Random类,我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

JavaDoc到Math.random()读取(部分),

  

首次调用此方法时,它会创建一个新的伪随机数生成器,就像表达式

一样
new java.util.Random()

因此,如果您想设置种子,我相信您必须使用Random(long)构造函数(或调用Random.setSeed(long))。

答案 1 :(得分:0)

没有办法显式地种子Math.random,它在第一次使用系统时钟作为种子调用时获得一个新的Random()实例。

请注意,播种Math.random和Random在某种程度上是徒劳的。 Math.random是Random()的前端。 Random()是一个线性同余生成器,如果你知道序列生成的任何一个数字,它就会产生一个可预测的数字序列。 Math.random和Random都不会产生适合需要不可预测性的应用程序的数字。就此而言,LCG甚至不是完全统计随机的。它唯一能实现的是它非常非常快,因此对于诸如分发哈希值之类的东西很有用,其中可预测性是无关紧要的(或者甚至是加号),而且有点随机的是#34;足够好& #34;

http://en.wikipedia.org/wiki/Linear_congruential_generator

如果您需要加密随机数(即即使您知道之前生成的数字也无法预测),请使用加密库的PRNG实现,而不是随机()或数学。随机。请参阅JCA SecureRandom类。互联网将感谢你没有添加各种各样的安全漏洞,这些漏洞困扰着软件,人们误以为Random()或Math.random会产生真正随机的数字流。