本文共 4505 字,大约阅读时间需要 15 分钟。
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
两种构造方法
方法等:
boolean | () 返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 |
void | (byte[] bytes) 生成随机字节并将它们放入用户提供的字节数组中。 |
double | () 返回下一个伪随机数,从这个随机数发生器的序列中 |
float | () 返回下一个伪随机数,从这个随机数发生器的序列中 |
double | () 从该随机数发生器的序列返回下一个伪随机数,高斯(“正”)分布 |
int | () 返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 |
int | (int bound) 返回伪随机的,均匀分布 |
long | () 返回下一个伪,均匀分布 |
void | (long seed) 使用单个 |
测试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 }
ThreadLocalRandom 是Java7 新增类,是Random类的子类,在多线程并发情况下,ThreadLocalRandom 相对于Random可以减少多线程资源竞争,保证了线程的安全性。
原理分析参考文章:
方法等
double | (double origin, double bound) 返回指定的起始(含)和绑定(排除)之间的伪随机 |
int | (int origin, int bound) 返回指定原点(含)和指定边界(排除)之间的伪随机 |
long | (long bound) 返回在零(包括)和指定的边界(排除)之间的伪随机 |
long | (long origin, long bound) 返回指定的起始(含)和指定的绑定(排除)之间的伪随机 |
测试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) }
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()方法。
原理参考文章:
方法等:
static | () 静态工厂检索一个类型4(伪随机生成)的UUID。 |
| () 返回代表这个 |
测试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 ~
转载地址:http://jncgn.baihongyu.com/