生成相同的随机数序列

时间:2011-10-26 11:44:46

标签: java

我想在java中生成随机数,我知道我应该使用像Math.random()这样的现有方法,但是,我的问题是:每次运行我的应用程序时,如何生成相同的数字序列? 示例:生成的序列为:0.9,0.08,0.6 所以我希望每次执行这个方法时都会生成这个序列..

5 个答案:

答案 0 :(得分:31)

当然 - 只需创建Random的实例,而不是使用Math.random(),并始终指定相同的种子:

Random random = new Random(10000); // Or whatever seed - maybe configurable
int diceRoll = random.nextInt(6) + 1; // etc

请注意,如果您的应用程序涉及多个线程,则会变得更加困难,因为时间变得难以预测。

这利用了Random作为pseudo-random number generator - 换句话说,每当你要求它获得一个新结果时,它会操纵内部状态给你一个随机的序列,但知道种子(或者当前的内部状态)它完全可以预测。

答案 1 :(得分:26)

重复使用相同种子的示例。

public static void main(String... args) throws IOException {
    printDoublesForSeed(1);
    printDoublesForSeed(128);
    printDoublesForSeed(1);
    printDoublesForSeed(128);
}

private static void printDoublesForSeed(long seed) {
    double[] doubles = new double[10];
    Random rand = new Random(seed);
    for (int j = 0; j < doubles.length; j++) {
        doubles[j] = (long) (rand.nextDouble() * 100) / 100.0;
    }
    System.out.println("doubles with seed " + seed + " " + Arrays.toString(doubles));
}

打印

doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93]
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47]
doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93]
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47]

编辑随机种子的有趣滥用。

public static void main(String ... args) {
    System.out.println(randomString(-6225973)+' '+randomString(1598025));
}

public static String randomString(int seed) {
    Random rand = new Random(seed);
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<5;i++)
        sb.append((char) ('a' + rand.nextInt(26)));
    return sb.toString();
}

打印

hello world

答案 2 :(得分:6)

您需要为随机数生成器播种。

Random random = new Random(aFixedNumber);
random.nextInt();  // will always be the same

答案 3 :(得分:4)

Math.random只是类java.util.Random的包装器。第一次调用Math.random时,会创建类java.util.Random的实例。

现在,大多数API都不公开任何 true 随机数生成器,因为它们无法在软件中实现。相反,他们使用伪随机数字生成器,它使用一堆公式生成一系列随机数字。这就是java.util.Random的作用。但是,每个伪随机数生成器都需要首先播种。如果你有两个伪随机数生成器使用相同的算法并使用相同的种子,它们将产生相同的输出。

默认情况下,java.util.Random使用自1970年1月1日以来的毫秒数作为种子。因此,每次启动程序时,它都会产生不同的数字(除非你管理它以在1毫秒内启动java)。因此,您的问题的解决方案是创建自己的java.util.Random实例并自行播种:

import java.util.Random;

class ... {
    Random randomNumberGenerator = new Random(199711);

    public void ...()
    {
        int randomInt = randomNumberGenerator.nextInt();
        double randomDouble = randomNumberGenerator.nextDouble();
    }
}

只要您不更改种子(randomNumberGenerator),199711将始终吐出相同的数字序列。

答案 4 :(得分:0)

我会将数字硬编码到应用中。这需要更多的内存,但要快得多。

只需将随机数打印到终端,然后将其复制粘贴到您的代码中即可。

请务必留下评论,解释您所做的事情,否则对于不知情的读者来说,它们看起来就像是黑魔法。