众所周知,随机数是任何编程语言的最基本特征之一。生成随机数的基本方法是相同的:生成0和1之间的随机数。这似乎很简单,但有时我们忽略了一些有趣的特性。
我们从书本上学到什么?
最明显的是,这也是一种直观的方式来产生随机数,只要简单的 java 调用称为:
<pre>java.lang.Math.random() </pre>
在所有其他语言,生成的随机数是喜欢用数学工具类,如ABS、战俘、地板、开方、和其他的数学函数。大多数人通过书本、教程和课程来了解这门课。一个简单的例子:从0到1可以生成一个双精度浮点数。然后通过上面的信息,开发人员在0到10之间生成一个双精度浮点数。
<pre>Math.random() * 10 </pre>
在0到10之间生成的整数将被写成:
<pre>Math.round(Math.random() * 10) </pre>
先进的
通过阅读源代码(数学。随机),或简单地使用IDE自动完成,开发者可以很容易地找到(java。lang.math。随机)使用一个内部的随机生成的对象-一个非常强大的对象可以随机生成灵活: 布尔值 、数字类型,甚至高斯分布。例如:
<pre>new java.util.Random().nextInt(10) </pre>
它有一个缺点,即它是一个对象。它的方法必须由实例调用,这意味着必须首先调用它的构造函数。如果有足够的内存java随机数概率 算法java随机数概率 算法 Java随机数的几种有趣用法,上面的表达式是可以接受的;但是当内存不够时,就会造成问题。
一个简单的解决方案可以避免每次需要生成一个随机数时创建一个新实例,即使用静态类。我猜你可能会想到java.lang.math,嗯,我们的改进java.lang.math初始化。虽然这个项目是低的,你必须做一些简单的单元测试java随机数概率 算法,以确保它不会出错。
如果程序需要生成一个随机数来存储它,问题又来了。例如,有时需要操作或保护种子,内部数字用于存储状态并计算下一个随机数。在这些特殊情况下,共享随机生成的对象是不合适的。
并发
在java EE的多 线程 应用程序环境,随机生成实例对象可以存储在类或其他类的实现,作为一个静态属性。幸运的是,java.util.是线程安全的,所以没有风险,多个线程调用可以毁灭的种子(种子)。
另一个要考虑的是多线程java.lang.实例。偷懒的办法是通过java本身的API实现的一个实例,当然你也可以确保每个线程都有自己的实例对象。
虽然java不管理java.util.单实例提供了一个很好的方式。然而,长期等待的java 7提供了生成随机数的新方法:
<pre>java.util.concurrent.ThreadLocalRandom.current().nextInt(10) </pre>
新的API结合其他两种方法的优点:单实例/静态访问,如Math.(灵活)。也比任何其他方法处理高并发的更快。
经验
Chris Georg指出:
<pre>Math.round(Math.random() * 10) </pre>
分布是不均匀的,例如,0 – 0.将是五到0,0.5到1.将是四和五到1。然后如何使用旧语法来实现正确的平衡分布,如下所示:
<pre>Math.floor(Math.random() * 11) </pre>
幸运的是,如果我们用java.util.或java.util..,我们不必担心上述问题。
java实际项目介绍了一些对java.util.使用不当的危险API。这一课告诉我们不要使用它。
<pre>Math.abs(rnd.nextInt())%n </pre>
和使用:
<pre>rnd.nextInt(n) </pre>