Java 随机自播种

Java 随机自播种,java,random,Java,Random,我发现很多关于这个类的例子如下: Random random = new SecureRandom(); int randomInteger = random.nextInt(); try { Random random = SecureRandom.getInstance("SHA1PRNG"); int randomInteger = random.nextInt(); } catch (NoSuchAlgorithmException exception) { /

我发现很多关于这个类的例子如下:

Random random = new SecureRandom();
int randomInteger = random.nextInt();
try
{
    Random random = SecureRandom.getInstance("SHA1PRNG");
    int randomInteger = random.nextInt();
}
catch (NoSuchAlgorithmException exception)
{
    // ...
}
或者像这样:

Random random = new SecureRandom();
int randomInteger = random.nextInt();
try
{
    Random random = SecureRandom.getInstance("SHA1PRNG");
    int randomInteger = random.nextInt();
}
catch (NoSuchAlgorithmException exception)
{
    // ...
}
或者类似的东西

但是,和在其文档中都有此部分:

返回的
SecureRandom
对象尚未设定种子。要为返回的对象设置种子,请调用
setSeed
方法。如果未调用
setSeed
,则对
nextBytes
的第一次调用将强制
SecureRandom
对象自身进行种子设定。如果先前调用了
setSeed
,则不会发生这种自播种

因此,在上面的示例中,对象永远不会在创建时播种。的文档(来自
Random
类文档,它在
SecureRandom
中不被覆盖)说明:

方法
nextInt
是通过类
Random
实现的,就像通过:

因此,没有对方法的调用,
SecureRandom
中的方法文档也没有提到任何关于种子设定的内容

我的问题是:上面的
随机
对象是否确定已播种?所有这些例子都是错的还是我遗漏了什么?我能安全地使用这样一个非种子随机数发生器吗


正如一篇评论中正确指出的那样,查看似乎是
next
调用
nextBytes
,因此初始化种子,但是文档中没有提到这一点。

对于Sun的JRE,可以使用
SecureRandom
而不进行种子设定吗?不,因为@assylias在评论中指出的原因
nextInt
调用
nextBytes
,从而确保
SecureRandom
被播种


Java平台的替代实现能否提供一个
SecureRandom
,它可以在不进行种子植入的情况下使用,同时仍然符合文档化的接口?对那会很糟糕吗?哦,是的。有谁会愚蠢到做这样的事情呢?可能不会。这是Java程序员需要担心的吗?不。

next(32)
调用
nextBytes
@assylias:你怎么会这么想?我在JDK1.7的源代码中没有看到这样的调用?@assylias:看看(第472行)这似乎是真的,但是文档中没有提到。啊,没关系。是的,SecureRandom将覆盖下一个(int)以使用下一个字节。@assylias,您可以发布此问题的答案。文档是否缺少某些内容?可能是的。两个月后,据了解。