2

我不禁注意到......在我开始开发我的数学游戏(并在不断调整它后将其提供给 beta 测试人员,但我仍然没有完成!)之后,我的使用java.util.Random和它的方法nextInt()可能不会我正在寻找的可靠的救世主课程。是为像我这样的应用程序生成随机数吗?//这个应用程序的重点是制作一个对所有人都具有挑战性的算术游戏,让您解决整数和浮点参数的问题。我的程序生成的最高数字是 6 位数字,这是因为我在人类计算器(最高级别)难度(即除法问题)中使用了一些不同的逻辑。我正在考虑使用 Mersenne twister 算法,但我认为使用的算法java.util.Random是这样的: http: //docs.oracle.com/javase/7/docs/api/java/util/Random.html#next%28int%29

另外,我想知道是否建议我使用类似的东西new java.util.Random(System.currentTimeMillis())

4

3 回答 3

6

Random的无参数构造函数已经基于当前时间(通过其 cpu nanoTime 而不是 UTC 日期),因此只需创建它每次都会为您提供不同的种子。种子Random(long)版本(根据我的经验)主要在您想要可预测的输出时使用(例如,计算机游戏的一些程序生成例程,允许玩家指定随机种子)

如果您非常担心随机数的随机性,您可能需要查看SecureRandom,推荐使用普通 Random 进行加密等。有一个很好的解释如何在这里使用它和一个很好的解释两者之间的区别here

于 2013-06-24T04:40:21.237 回答
3

其他答案已经很好地涵盖了这一点,特别是 mfrankli 关于统计随机和密码随机之间差异的答案。在你的情况下,你真的只需要后者,所以java.util.Random就足够了。

话虽如此,一个容易犯的错误(至少让我痛苦过一次)是Random在短时间内创建许多实例。例如,new Random()每次需要随机数时调用。您应该初始化Random一次并尽可能地重复使用它。由于Random是从系统时间播种的(即使是纳米级),在非常接近同一时间创建的一系列Random实例的输出将不会均匀分布。

于 2013-06-24T04:48:18.543 回答
2

简短的回答:是的,java.util.Random应该适合您的应用程序;并且简单地使用没有参数的构造new java.util.Random()函数也应该没问题。

更长的答案:java.util.Random不是加密安全的——这里有一个技术定义,但本质上它还不够“随机”,让安全人员感到使用它是安全的;攻击者可能会猜测产生的随机数。但是,它满足另外两个重要属性:

  1. 类似于随机分布,即每个值都有可能被生成。
  2. 非确定性的,即每次都会得到不同的值序列。

换句话说:你应该很高兴。

于 2013-06-24T04:41:39.183 回答