【问题标题】:Why does the use of Random with a hardcoded seed always produce the same results? [duplicate]为什么使用带有硬编码种子的 Random 总是产生相同的结果? [复制]
【发布时间】:2011-12-24 01:55:15
【问题描述】:

以下 Java 简单程序使用 java.util.Random 类,因此它始终显示“hello world”。代码sn-p如下所示。

package nomain;

import java.util.Random;

final public class J
{
    public static String randomString(int seed)
    {
        Random rand = new Random(seed);
        StringBuilder sb = new StringBuilder();

        for(int i=0;;i++)
        {
            int n=rand.nextInt(27);
            if (n==0)
            {
                break;
            }
            sb.append((char) ('`'+n));
        }
        return sb.toString();
    }

    public static void main(String args[])
    {
        System.out.println(randomString(-229985452)+' '+randomString(-147909649));
    }
}

令人惊讶的是,即使使用了导致随机数生成的 Random 类,它也始终显示“hello world”,因此,每次运行时都应更改数字并相应更改相应的字符,但它总是只显示一个稳定的字符串,就是上面提到的“hello world”。为什么会这样?

【问题讨论】:

  • 这可能与随机数生成器是确定性的事实有关...意思是,如果使用相同的种子值,则每次都会生成相同的序列。但我并不积极。
  • 这个问题不是那个问题的重复。这个问题是这个问题的重复。

标签: java random


【解决方案1】:

答案是传入的参数。它用于播种随机数生成器。

Random rand = new Random(seed);

PRNG 并不是真正随机的 - 它们是确定性的,但旨在模拟随机性。出于这个原因,它们被更好地称为“伪随机数生成器”。

对于给定的种子,PRNG 将始终生成相同的数字。然后它可能会使用其最后一个结果作为下一个值的输入,因此通过使用已知值播种 PRNG,您将始终生成一个已知的“随机”数字序列。

已知数字 -229985452 和 -147909649 是种子,它们会导致特定的 PRNG 生成一个由 5 个数字组成的序列,这些数字可以解释为“hello”和“world”。如果您要更改这些数字,您会得到不同的 5 个字符序列,但对于程序的每次运行,它们都是相同的,只要种子保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多