网站首页 > java教程 正文
众所周知,随机数是任何编程语言的最基本特征之一。生成随机数的基本方法是相同的:生成0和1之间的随机数。这似乎很简单,但有时我们忽略了一些有趣的特性。
我们从书本上学到什么?
最明显的是,这也是一种直观的方式来产生随机数,只要简单的java调用称为:
java.lang.Math.random()
在所有其他语言,生成的随机数是喜欢用数学工具类,如ABS、战俘、地板、开方、和其他的数学函数。大多数人通过书本、教程和课程来了解这门课。一个简单的例子:从0到1可以生成一个双精度浮点数。然后通过上面的信息,开发人员在0到10之间生成一个双精度浮点数。
Math.random() * 10
在0到10之间生成的整数将被写成:
Math.round(Math.random() * 10)
先进的
通过阅读源代码(数学。随机),或简单地使用IDE自动完成,开发者可以很容易地找到(java。lang.math。随机)使用一个内部的随机生成的对象-一个非常强大的对象可以随机生成灵活:布尔值、数字类型,甚至高斯分布。例如:
new java.util.Random().nextInt(10)
它有一个缺点,即它是一个对象。它的方法必须由实例调用,这意味着必须首先调用它的构造函数。如果有足够的内存,上面的表达式是可以接受的;但是当内存不够时,就会造成问题。
一个简单的解决方案可以避免每次需要生成一个随机数时创建一个新实例,即使用静态类。我猜你可能会想到java.lang.math,嗯,我们的改进java.lang.math初始化。虽然这个项目是低的,你必须做一些简单的单元测试,以确保它不会出错。
如果程序需要生成一个随机数来存储它,问题又来了。例如,有时需要操作或保护种子,内部数字用于存储状态并计算下一个随机数。在这些特殊情况下,共享随机生成的对象是不合适的。
并发
在java EE的多线程应用程序环境,随机生成实例对象可以存储在类或其他类的实现,作为一个静态属性。幸运的是,java.util.random是线程安全的,所以没有风险,多个线程调用可以毁灭的种子(种子)。
另一个要考虑的是多线程java.lang.threadlocal实例。偷懒的办法是通过java本身的API实现的一个实例,当然你也可以确保每个线程都有自己的实例对象。
虽然java不管理java.util.random单实例提供了一个很好的方式。然而,长期等待的java 7提供了生成随机数的新方法:
java.util.concurrent.ThreadLocalRandom.current().nextInt(10)
新的API结合其他两种方法的优点:单实例/静态访问,如Math.random(灵活)。threadlocalrandom也比任何其他方法处理高并发的更快。
经验
Chris Marasti Georg指出:
Math.round(Math.random() * 10)
分布是不均匀的,例如,0 - 0.499999将是五到0,0.5到1.499999将是四和五到1。然后如何使用旧语法来实现正确的平衡分布,如下所示:
Math.floor(Math.random() * 11)
幸运的是,如果我们用java.util.random或java.util.concurrent.threadlocalrandom,我们不必担心上述问题。
java实际项目介绍了一些对java.util.random使用不当的危险API。这一课告诉我们不要使用它。
Math.abs(rnd.nextInt())%n
和使用:
rnd.nextInt(n)
猜你喜欢
- 2024-09-08 JavaWeb项目各种随机数主键ID的代码范例供大家参考学习
- 2024-09-08 Java中List集合有哪些特性?Java开发常见集合
- 2024-09-08 这么一篇.Java性能权威指南.不需要好好的了解一下吗?
- 2024-09-08 一篇文章彻底弄懂CAS实现SSO单点登录原理
- 2024-09-08 Java练习:输出并统计水仙花数、猜数字小游戏
- 2024-09-08 Javaweb代码创建JESESSION32位随机数及session最大不活动时间
- 2024-09-08 Java 中生成一组不重复随机整数的简便方法
- 2024-09-08 JDK 17 - Java 17 的新特性速览(java的什么特性实现了软件开发人员一次编写)
- 2024-09-08 Java教学:Integer、日期类、数字类、随机数、枚举,一次搞定!
- 2024-09-08 Java程序员面试宝典:用这100个问答搞定面试官
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)