`
dantily
  • 浏览: 7928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java随机数

 
阅读更多

众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数。看似简单,但有时我们也会忽略了一些有趣的功能。

我们从书本上学到什么?

最明显的,也是直观的方式,在JAVA中生成随机数只要简单的调用:

java.lang.Math.random()

在所有其他语言中,生成随机数就像是使用Math工具类,如abs, pow, floor, sqrt和其他数学函数。大多数人通过书籍、教程和课程来了解这个类。一个简单的例子:从0.0到1.0之间可以生成一个双精度浮点数。那么通过上面的信息,开发人员要产生0.0和10.0之间的双精度浮点数会这样来写:

Math.random()*10

而产生0和10之间的整数,则会写成:

Math.round(Math.random()*10)

进阶

通过阅读Math.random()的源码,或者干脆利用IDE的自动完成功能,开发人员可以很容易发现,java.lang.Math.random()使用一个内部的随机生成对象 - 一个很强大的对象可以灵活的随机产生:布尔值、所有数字类型,甚至是高斯分布。例如:

newjava.util.Random().nextInt(10)

它有一个缺点,就是它是一个对象。它的方法必须是通过一个实例来调用,这意味着必须先调用它的构造函数。如果在内存充足的情况下,像上面的表达式是可以接受的;但内存不足时,就会带来问题。

一个简单的解决方案,可以避免每次需要生成一个随机数时创建一个新实例,那就是使用一个静态类。猜你可能想到了java.lang.Math,很好,我们就是改良java.lang.Math的初始化。虽然这个工程量低,但你也要做一些简单的单元测试来确保其不会出错。

假设程序需要生成一个随机数来存储,问题就又来了。比如有时需要操作或保护seed,一个内部数用来存储状态和计算下一个随机数。在这些特殊情况下,共用随机生成对象是不合适的。

并发

在Java EE多线程应用程序的环境中,随机生成实例对象仍然可以被存储在类或其他实现类,作为一个静态属性。幸运的是,java.util.Random是线程安全的,所以不存在多个线程调用会破坏seed的风险。

另一个值得考虑的是多线程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 - 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)

分享到:
评论

相关推荐

    java随机数生成器

    可以生成制定范围内的随机数。有GUI界面

    java随机数逆向运算( test8.java )

    java随机数逆向运算( test8.java ) 相关博客http://blog.csdn.net/qq185773126/article/details/47336593

    【转】利用系统时间可预测破解java随机数

    标题中的“利用系统时间可预测破解java随机数”揭示了一个重要的信息安全问题,即Java的随机数生成器在某些情况下可能不那么随机,可以被有心人利用系统时间预测。这通常发生在程序依赖于系统时间来生成随机数序列时...

    java随机数逆向运算( Random.java )

    java随机数逆向运算( Random.java ) 相关博客http://blog.csdn.net/qq185773126/article/details/47336593

    java 随机数的资源

    在Java编程语言中,随机数的应用非常广泛,可以用于各种模拟、游戏开发、加密算法以及数据分析等场景。本文将深入探讨Java中生成随机数的方法、类库和实用技巧。 首先,Java提供了一个内置的`java.util.Random`类,...

    JAVA随机数

    JAVA语言中,随机数的简单练习,主要应用radom的函数

    可控制的Java随机数生成

    Java 随机数 可控制长度 自定义 随机数字字母

    java随机数操作类

    一个产生随机数的操作类,可自由定制随机数的类型个数等 用于产生校验码等

    java 随机数 Math.random

    //产生随机数的类 final SuiJiShuClass sjs=new SuiJiShuClass(); final JPanel panel=new JPanel(); //初始化一个JPanel panel.setBorder(BorderFactory.createTitledBorder("QQ:330936274")); //设置边界 ...

    java随机数生成,java基础

    java java随机数生成

    java随机数

    ### Java随机数生成详解 #### 引言 在软件开发领域,随机数生成是一项非常基础且重要的功能。尤其是在游戏开发、密码学、统计模拟等领域,随机数的应用无处不在。Java作为一门广泛应用的编程语言,提供了多种生成...

    Java随机数的编程

    ### Java随机数编程详解 #### 引言 在软件开发中,随机数的生成是一个常见且重要的需求。无论是游戏开发中的随机事件,还是数据分析中的模拟实验,亦或是密码学中的安全算法,都离不开随机数的支持。Java作为一种...

    Java简易随机数生成

    Java简易随机数生成 下载完请输入测试代码 public static void main(String[] args) { System.out.println(random(50,100));//example System.out.println(random(50.0,100.0)); }

    java随机数.pdf

    一、Java随机数生成方式 1. `System.currentTimeMillis()`:返回当前系统时间的毫秒数,这是一个长整型(`long`)数值,可以用来生成具有时间依赖性的唯一随机数。 2. `Math.random()`:返回一个0到1之间的双精度...

    java 随机数

    ### Java随机数生成详解 #### 引言 在软件开发中,随机数的生成是一项基本且重要的技术,尤其是在游戏、安全、统计分析等领域。Java语言提供了多种方式来生成随机数,满足不同场景的需求。本文将深入探讨Java中...

    java随机数4-36位

    在Java编程语言中,生成随机数是一项常见的任务,特别是在创建安全的验证码系统或者构建订单编号时。本篇文章将深入探讨如何在Java中生成指定范围内的随机数,包括4位到36位的数字,以及结合时间戳来创建更复杂的30...

    java随机数逆向运算( test9.java )

    java随机数逆向运算( test9.java ) 相关博客http://blog.csdn.net/qq185773126/article/details/47336593

    Java随机数算法原理与实现方法实例详解.docx

    Java 随机数算法是编程中常用的一种技术,主要用于模拟不确定性的行为。在Java中,随机数的生成主要依赖于`java.util.Random`类。这个类提供了多种方法来生成不同类型的随机数,包括整数、浮点数以及随机二进制序列...

    Java随机数算法原理与实现方法实例详解

    Java随机数算法原理与实现方法实例详解 随机数算法是计算机科学中一个非常重要的领域,Java随机数算法原理与实现方法是其中一个非常关键的部分。本文主要介绍了Java随机数算法原理与实现方法,简单分析了随机数算法...

    用JAVA写的随机数程序

    java 随机数 带有GUI界面, 36选2 小程序, 带有界面

Global site tag (gtag.js) - Google Analytics