将随机对象的种子设置为随机值会使生成器更随机吗?

3

我有这段代码可以模拟10次抛硬币的过程:

public void FlipCoinTenTimes() {
    Random randomNumberGenerator = new Random();

    // Generate 10 random numbers
    for (int i = 0; i < 10; i++) {
        randomNumberGenerator.setSeed(randomNumberGenerator.nextLong());
        System.out.println(randomNumberGenerator.nextInt(2) == 0 ? "Heads" : "Tails");
    }
}

将种子设置为随机长整型是否会使此方法更加随机?也就是说,如果我删除setSeed()行,是否比这个方法更50/50(即50%的概率)?


无论种子是什么,它都是“50/50平等”的。种子只会影响你得到哪个特定的“50/50”序列。 - user253751
@immibis 我不确定。我自己在问的问题是:“如何将种子更改为新的随机值不会影响生成器的随机性?” - Ogen
@immibis 是的,但是对于给定的种子,序列不是相同的吗?因此更改种子将更改序列。 - Ogen
生成器产生的任何结果实际上并不是随机的。您可以尝试从高分辨率时间或用户的鼠标移动等获取一些实际的随机性,并用此为种子生成器,或者使用SecureRandom进行加密保证。将随机数生成器用其自身进行种子处理实际上只会使生成器更加复杂,而非更富确定性。 - Jeffrey Bosboom
@Ogen 是的。但是所有序列都将是“平均50/50”,这就是你所问的。 - user253751
1个回答

3
不会,像这样设置种子不会使其“更随机”。默认构造函数将使用随机种子。
Random类使用线性同余生成器生成一系列伪随机位。随机类的状态包含在称为种子的东西中。当要求随机数时,种子被更新
手动重置随机数的分布不应该影响分布。如果需要更好的分布,同时也更难预测,可以使用{{link5:SecureRandom}}。

当然,必须最初设置种子,但每次更改种子都必须产生影响吗?我已经读到一些特定的种子会生成类似的序列,因此随机更改种子应该使它整体上更加随机。至少这是我想的。 - Ogen
@msw,根据上面链接的文档,那不是正确的。 - vidstige
@Wakahiu Njenga,感谢您的编辑,但似乎更适合在自己的答案中。 - vidstige
@vidstige:你说得对。不知怎么回事,我以为这个问题是关于Python的。对于我的错误和矛盾表示抱歉。 - msw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接