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.0和1.0之间的double值0.0分布。floatnextFloat()返回下一个伪随机数,从这个随机数发生器的序列中
0.0和1.0之间的float值0.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()返回代表这个
UUID的String对象。
-
测试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 ~
