Java Random、ThreadLocalRandom和UUID随机数类

一、java.util.Random

      Random 类的实例用于生成伪随机数

      Random 类将 种子数 作为随机算法的起源数字,计算生成伪随机数,其与生成的随机数字的区间无关

      创建 Random 实例时,若没有指定种子数,则会以当前时间 作为种子数,来计算生成伪随机数

      拥有相同种子的 Random 实例,在相同次数下,生成的伪随机数完全相同

        Random random = new Random(10);
        Random random2 = new Random(10);
        System.out.println(random.nextInt()); // -1157793070
        System.out.println(random2.nextInt());// -1157793070

两种构造方法

   

方法等:

    • booleannextBoolean()

      返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 boolean值。

      voidnextBytes(byte[] bytes)

      生成随机字节并将它们放入用户提供的字节数组中。

      doublenextDouble()

      返回下一个伪随机数,从这个随机数发生器的序列中 0.01.0之间的 double0.0分布。

      floatnextFloat()

      返回下一个伪随机数,从这个随机数发生器的序列中 0.01.0之间的 float0.0分布。

      doublenextGaussian()

      从该随机数发生器的序列返回下一个伪随机数,高斯(“正”)分布 double值,平均值为 0.0 ,标准差为 1.0

      intnextInt()

      返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 int值。

      intnextInt(int bound)

      返回伪随机的,均匀分布 int值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。

      longnextLong()

      返回下一个伪,均匀分布 long从这个随机数生成器的序列值。

      voidsetSeed(long seed)

      使用单个 long种子设置该随机数生成器的种子。

测试demo

    public static void main(String[] args) {
        Random random = new Random();

        byte[] data = new byte[5];
        random.nextBytes(data);
        System.out.println(Arrays.toString(data)); // [59, 19, -35, 46, 36]

        System.out.println(random.nextBoolean());  // true
        System.out.println(random.nextDouble());   // [0.0,1.0) double值 0.9081744035754137
        System.out.println(random.nextDouble() * 6.8 + 2.2); // [2.2,9.0) double值 6.2376803909751075
        System.out.println(random.nextFloat());    // [0.0,1.0) float值 0.79999745
        System.out.println(random.nextGaussian()); // 0.25398377648474524
        System.out.println(random.nextInt());      // 2044070728
        System.out.println(random.nextInt(100)); //[0,100) 20
        System.out.println(random.nextLong());     // -4206112352264767924
    }

二、java.util.concurrent.ThreadLocalRandom

       ThreadLocalRandom 是Java7 新增类,是Random类的子类,在多线程并发情况下,ThreadLocalRandom 相对于Random可以减少多线程资源竞争,保证了线程的安全性

       原理分析参考文章:ThreadLocalRandom类原理

 

方法等

    • doublenextDouble(double origin, double bound)

      返回指定的起始(含)和绑定(排除)之间的伪随机 double值。

      intnextInt(int origin, int bound)

      返回指定原点(含)和指定边界(排除)之间的伪随机 int值。

      longnextLong(long bound)

      返回在零(包括)和指定的边界(排除)之间的伪随机 long值。

      longnextLong(long origin, long bound)

      返回指定的起始(含)和指定的绑定(排除)之间的伪随机 long值。

 测试demo

    public static void main(String[] args) {
        ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();

        System.out.println(threadLocalRandom.nextDouble());   // [0.0,1.0) double值
        System.out.println(threadLocalRandom.nextDouble() * 6.8 + 2.2); // [2.2,9.0) double值
        System.out.println(threadLocalRandom.nextDouble(2.2,2.9)); // [2.2,9.0) double值
        System.out.println(threadLocalRandom.nextInt());      // 
        System.out.println(threadLocalRandom.nextInt(49,99)); //[49,99)
    }

三、java.util.UUID

1、UUID是什么?

        UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。 ----- 来自百度百科

2、UUID组成:

     UUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成UUID。

     UUID的唯一缺陷在于生成的结果串比较长。

     标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)。

3、UUID由以下几部分的组合:

    (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

    (2)时钟序列。

    (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

     Java为了方便处理,设计了java.util.UUID类,这个类可以生成以上格式的字符串这个类我们主要使用一个 public static UUID randomUUID()方法。

     原理参考文章:java类uuid源码分析

方法等:

    • static UUIDrandomUUID()

      静态工厂检索一个类型4(伪随机生成)的UUID。

      StringtoString()

      返回代表这个 UUIDString对象。

测试demo:自定义的 UUIDUtils 类挺实用的

public class ThreadDemo {
    public static void main(String[] args) {
        System.out.println(UUIDUtils.get36UUID()); // d5dfb562-1e44-497a-b458-96eb369b5f80
        System.out.println(UUIDUtils.get32UUID()); // 3dd501101d684e358b9781f984dba457
        System.out.println(UUIDUtils.get16UUID()); // 6000001717806665
    }
}

class UUIDUtils {
    private UUIDUtils(){ }

    /**
     * 获取 UUID 生成随机36位的字符串
     * @return String 36位的字符串
     */
    public static String get36UUID(){
        return UUID.randomUUID().toString();
    }

    /**
     * 获取 UUID 生成32位的字符串
     * @return String 32位的字符串
     */
    public static String get32UUID(){
        return UUID.randomUUID().toString().replace("-", "");
    }
    /**
     * 获取 UUID 生成16位的字符串
     * @return String 16位的字符串
     */
    public static String get16UUID(){
        int first = new Random(10).nextInt(8) + 1;
        //int hashCodeV = UUID.randomUUID().toString().hashCode();
        int hashCodeV = get36UUID().hashCode();
        if (hashCodeV < 0) { // 有可能是负数
            hashCodeV = -hashCodeV;
        }
        // 0 代表参数前面补充0
        // 15 代表参数长度为15
        // d 代表参数为正整数类型(十进制)
        return first + String.format("%015d", hashCodeV);
    }
}

 

ends ~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值