【发布时间】:2014-09-11 18:52:29
【问题描述】:
我有一个大问题:
我可以使用种子数来生成随机数:
Random rand = new Random(34666666);
但我无法理解的是那颗种子的作用。例如
的区别是什么该代码具有以下内容:
Random rand = new Random();
【问题讨论】:
我有一个大问题:
我可以使用种子数来生成随机数:
Random rand = new Random(34666666);
但我无法理解的是那颗种子的作用。例如
的区别是什么该代码具有以下内容:
Random rand = new Random();
【问题讨论】:
当您向one-arg Random constructor 提供特定的硬编码种子时,每次运行程序时生成的随机数将始终相同。当您需要可预测的随机数来源时,这是需要的。
但是,当您不提供种子时,Random constructor 将根据System.nanoTime 为您选择种子。每次运行程序时随机数都会不同,因为每次运行的种子都会不同。
创建一个新的随机数生成器。此构造函数将随机数生成器的种子设置为一个很可能与此构造函数的任何其他调用不同的值。
这很重要,因为 Java 的随机数生成器是伪随机的;每个新的伪随机数都会影响用于生成下一个伪随机数的种子。
【讨论】:
种子允许您获得确定的随机数序列。
当您需要生成随机数但又能够再次启动并获得相同结果时,它特别有用。
如果没有种子,构造函数会根据 Random 对象被实例化的时间为您选择一个。
【讨论】:
如果您查看 java.util.java (http://developer.classpath.org/doc/java/util/Random-source.html) 的代码,您会看到构造函数使用当前时间戳作为其种子:
public Random()
{
this(System.currentTimeMillis());
}
【讨论】:
我建议阅读 Random 上的 Java 文档。 http://docs.oracle.com/javase/7/docs/api/java/util/Random.html
一些重要的部分:
If two instances of Random are created with the same seed, and the same sequence of method calls is made for each, they will generate and return identical sequences of numbers.
public Random()
Creates a new random number generator. This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.
【讨论】:
Java随机函数是这样的:
numberi+1 = (a * numberi + c) mod m
数字就是你的种子。
随机数并不是真正的随机数,如果我知道您当前的数字,那么我可以知道您将来会得到的所有数字。 (这就是为什么您应该始终使用静态随机数并且永远不要创建新随机数(您将获得相同的数字))
如果您需要更安全的随机数, 使用 java 的 SecureRandom 类。
它为您提供更安全的随机选择,使用鼠标移动的次数、鼠标的当前位置、自上次键入以来的秒数等...
【讨论】: