• Java 生成随机数


    Java中常用的两种产生随机数的方法

    一、java.lang.Math类中的random()方法;

    调用这个Math.random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。

    第一次调用该方法时,它将创建一个新的伪随机数生成器,与以下表达式完全相同

    new java.util.Random
    之后,新的伪随机数生成器可用于此方法的所有调用,但不能用于其他地方。

    此方法是完全同步的,可允许多个线程使用而不出现错误。但是,如果许多线程需要以极高的速率生成伪随机数,那么这可能会减少每个线程对拥有自己伪随机数生成器的争用。  

     
    二、java.util.Random类;
    1、java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;
    2、相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
    3、Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;
     
    下面Random()的两种构造方法
    1.Random():创建一个新的随机数生成器。
    2.Random(long seed):使用单个 long 种子创建一个新的随机数生成器。
     
    //获取当前时间的毫秒数作为随机数种子
    long t = System.currentTimeMillis();
    1.protected int next(int bits)://生成下一个伪随机数。
    2.boolean nextBoolean()://返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。
    3.void nextBytes(byte[] bytes)://生成随机字节并将其置于用户提供的 byte 数组中。
    4.double nextDouble()://返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值。
    5.float nextFloat()://返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。
    6.double nextGaussian()://返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。
    7.int nextInt()://返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
    8.int nextInt(int n)://返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。
    9.long nextLong()://返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
    10.void setSeed(long seed)://使用单个 long 种子设置此随机数生成器的种子。
     
    方法摘要也就这些,下面给几个例子:
    1.生成[0,1.0)区间的小数:double d1 = r.nextDouble();
    2.生成[0,5.0)区间的小数:double d2 = r.nextDouble() * 5;
    3.生成[1,2.5)区间的小数:double d3 = r.nextDouble() * 1.5 + 1;
    4.生成-231到231-1之间的整数:int n = r.nextInt();
    5.生成[0,10)区间的整数:
    int n2 = r.nextInt(10);//方法一
    n2 = Math.abs(r.nextInt() % 10);//方法二
     
    前面曾讲到过构造Random对象的时候指定种子的问题,到底指定种子有什么作用呢,这里直接用代码例子来做说明:
     Java中的Random()函数
    在定义的时候分别指定了相同的种子之后,在分别用r1和r2去[0,30)的随机数,结果编译执行后悔发现结果都是呈现AABB型的,说明r1和r2取的随机数是一模一样的(下图为实验截图)。
     Java中的Random()函数
    如果我改动代码,改成下面这样:
     Java中的Random()函数
    再编译输出后,就再也不会得到AABB型的结果,根据代码的区别,就可以知道指定种子数,和不指定种子数的区别在于哪里了。
     Java中的Random()函数
     
    最后再来简单对比一下这两个随机函数到底的特点:
    1.java.Math.Random()实际是在内部调用java.util.Random()的,它有一个致命的弱点,它和系统时间有关,也就是说相隔时间很短的两个random比如:
    double a = Math.random();
    double b = Math.random();
    即有可能会得到两个一模一样的double。
    2.java.util.Random()在调用的时候可以实现和java.Math.Random()一样的功能,而且他具有很多的调用方法,相对来说比较灵活。所以从总体来看,使用java.util.Random()会相对来说比较灵活一些。
     
    reference:
    https://www.cnblogs.com/uncle-box/p/5918743.html
  • 相关阅读:
    html上传图片后,在页面显示上传的图片
    arcgis 将日期字段赋值为当前日期
    一些使用文件夹重定向的系统中,运行ArcToolbox中的GP工具报IE脚本错误
    Gps中的 gpx文件和excel文件互相转换方法
    ARCMAP 本文将描述如何利用识别工具显示一幅与要素相关的图片。
    arcgis 正确显示标注的大小写
    在一些系统中,运行ArcToolbox中的任何GP工具报Microsoft脚本错误,并且工具对话框显示为空白
    arcgis Howto: 用空格作为分隔符提取字符串中的字符并赋值到另一个新字段
    使用.Net开发ArcGIS9扩展组件的注册到ArcMAP中
    arcgis 利用DEM寻找最小阻力路径 来自http://support.esrichinabj.cn/2008/0325/1189.html
  • 原文地址:https://www.cnblogs.com/dyx2018/p/9189700.html
Copyright © 2020-2023  润新知