我想在java中生成随机数,我知道我应该使用Math.random()这样的现有方法,但是,我的问题是:如何生成相同的数字序列,每次我运行我的应用程序? 例如:生成的顺序是:0.9,0.08,0.6 所以我想,这个序列将我每次执行该方法时产生..生成相同的随机数序列
17
A
回答
29
当然 - 只需创建的,而不是使用Math.random()
的Random
一个实例,始终指定相同的种子:
Random random = new Random(10000); // Or whatever seed - maybe configurable
int diceRoll = random.nextInt(6) + 1; // etc
请注意,如果您的应用程序涉及多个线程,则会变得更难,因为时序变得难以预测。
这利用了Random
是一个pseudo-random number generator - 换句话说,每次你问它一个新的结果,它操纵内部状态给你一个随机看看的序列,但知道种子(或实际上是当前的内部状态),这是完全可预测的。
6
您需要种子随机数发生器。
Random random = new Random(aFixedNumber);
random.nextInt(); // will always be the same
24
反复使用相同种子的示例。
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
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
)。
0
我会硬编码到应用程序的数字。这需要更多的内存,但速度要快得多。
只需将随机数打印到终端,然后将其复制粘贴到您的代码中。
一定要留下评论,解释你做了什么,否则他们会看起来像不知情的读者黑魔法。
相关问题
- 1. MATLAB:生成相同的随机数字序列
- 2. Python - 生成相同的随机数
- 3. 生成相同的随机数onclick
- 4. 生成大小相同的随机数
- 5. 随机数生成 - 数相同返回
- 6. 如何在java中生成两次相同的随机序列?
- 7. 如何生成相同的一系列伪随机整数?
- 8. 随机数发生器产生相同的随机数
- 9. 随机数生成 - 约束序列
- 10. 生成随机数序列与在Java
- 11. 生成混合随机数序列
- 12. 两个不同的种子产生相同的“随机”序列
- 13. C++ 11:使用C++ 11随机数支持库随机数,生成相同的序列的每个运行
- 14. 生成两个相同的随机数和一个不同的
- 15. 相同和不同的随机数生成
- 16. CURAND生成具有相同种子的不同随机数
- 17. 生成 “随机” 数是相同的javascript每次(即种子随机数)
- 18. 通过伪随机朴素随机数生成器生成随机数序列的正确方法
- 19. Haskell的随机生成的序列
- 20. C/C++算法从不同平台上的相同种子生成相同的伪随机数序列?
- 21. 每次产生相同的随机数
- 22. 生成相同随机数的Normrnd函数
- 23. Vb.net随机数字生成器重复相同的数字
- 24. 生成随机数,每次给予相同数量的
- 25. 生成字符串的随机序列
- 26. 批量随机数生成器 - 生成与之前相同的数
- 27. 生成不同的随机数
- 28. 生成不同的随机数
- 29. 对于相同的种子,由rand生成的随机数序列在C中保证总是相同的?
- 30. “新的随机(x)”总是生成相同的数字?
在线程的情况下,你可以给每个线程自己的随机(固定种子),或者如果你只使用一个预先填充的列表为每个从一个随机(具有固定的种子)。但是,如果线程彼此交互,这种方法不会再工作了。 – Stefan