生成相同的随机数序列

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

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

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

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

这利用了Random是一个伪随机数生成器 – 换句话说,每次你要求它获得一个新的结果时,它操纵内部状态给你一个随机的序列,但知道种子(或者实际上当前的内部)这是完全可以预测的。

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

 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 

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

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

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

现在,大多数API都没有暴露任何真正的随机数生成器,因为它们无法在软件中实现。 相反,他们使用伪随机数生成器,它使用一堆公式生成一系列随机数字。 这就是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 )。

我会将数字硬编码到应用程序中。 这需要更多内存,但速度更快。

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

一定要留下评论来解释你所做的事情,否则它们对于不知情的读者来说就像是黑魔法。