2012-04-07 18 views
2

有以生成Java随机数随机数字在Java中是否真的无法预知?

其中之一是这样的一些方法:

Random rand=new Random(); 
int randomInteger=rand.nextInt(); 

现在我的问题是:我们可以预测下一个随机数?


后4个答案编辑:

我真正的问题是这样的:

我工作的一个蛇游戏(在Linux下半字节)和我编程蛇动,现在我想知道是否有可能预测苹果将出现的下一个地方。

是否有可能?

+0

更新我的答案以解决您的编辑问题。 – 2012-04-07 15:28:18

回答

5

如果您确切知道System.currentTimeMillis会在您拨打new Random()时返回,您不仅可以预测它,但绝对知道它,。这是因为new Random()new Random(System.currentTimeMillis())的快捷键,它设置了伪随机生成器的种子。 (好吧,这就是我上次查看源代码时所做的事情;文档don't actually say它必须使用它。)如果您知道new Random()使用的种子。伪随机生成器是确定性的,如果你知道种子,你就知道序列。 更新:查看Java 6源代码[我没有Java 7源代码的便利],默认种子是使用时增加的种子编号的组合,再加上System.nanoTime。所以你需要知道这两个。提高酒吧。

如果知道System.currentTimeMillis()new Random()发生new Random()使用的种子的精确值,那么它的非常困难确实来预测下一个值将是什么。这就是伪随机发生器的要点。我不会说这是不可能的。真的很难做到任何信心。


问题编辑后更新:这是可能,但非常,非常努力,并在某种程度上这样的条款,将允许玩家提高自己在比赛中的分数,我说你可以忽略它。

2

由随机类生成的“随机”数字在算法上生成,因此实际上是伪随机数。所以是的,从理论上讲,你可以预测下一个数字。然而,知道随机产生的一个数字,甚至是一系列数字,都不足以预测下一个数字;您还需要知道Random对象正在使用的种子,并且您需要遵循其伪随机数生成算法。

如果您想要一组可重复的“随机”数字,您可以在创建随机实例时指定自己的种子,例如,

Random rand = new Random(1234); // Replace 1234 with any value you'd like 

每次使用相同的种子实例化Random时,您将得到相同的一系列数字。因此,例如,您可以编写一个小的命令行程序,用一些种子实例化Random并打印返回的数字列表,然后在您的代码中使用相同的种子实例化Random。然后你会知道你的代码将以什么顺序接收哪些数字。这对于调试非常方便。

+0

另外,如果你需要真正的随机数,有一些互联网可访问的服务,如http://www.random.org/,你可以查询基于自然现象,如大气噪声的随机数列表。 – MattK 2012-04-07 14:35:33

1

在计算机等确定性设备上可能没有真正的随机数。但。

如果你想有一个加密的安全随机数,使用的SecureRandom:http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html

随机使用确定的算法:

如果随机的两个实例使用相同的种子,以及同一序列的建立方法调用是为每个方法调用的,它们将生成并返回相同的数字序列。

http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#Random

+0

只有当您知道实施未在封面允许的范围内使用PRNG时。 – 2012-04-07 14:34:47

0

从本质上讲,如果你知道随机数发生器的种子,你可以预测确切的整个序列。如果不这样做,无论您生成多少个数字,都无法准确预测下一个数字。

请注意,如果您依赖的数字在安全性方面不可预知,则应该使用java.secure.SecureRandom而不是java.util.Random

0

正如其他人回答这个问题,如果你知道起始种子,可以预测java.util.Random的随机性。

如果您正在使用Linux系统,请查看这些特殊文件/dev/randomdev/urandom。据说这些文件的读取返回“更好”的随机数,随机性取决于键盘活动,鼠标移动和一些其他外来因素。

有关详细信息,请参阅此Wikipedia页面。这个页面还说在Windows中存在等效的API。