概述
一、通过Math类
(1)生成大于等于 0.0 且小于 1.0 的 double 值:
double a = Math.random();
Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值,如果想得到一个大于1的随机值,则需要再乘以一定的数值来实现。
(2)生成一个随机1到10的随机double值:
double a = Math.random()*(10-1)+1;
二、通过Random类
Random类实现的Random使用protected实用程序方法,每次调用可以提供多达32个伪随机生成位。
许多应用程序会发现方法Math.random()使用起来更简单。
java.util.Random的java.util.Random是线程安全的。 但是,跨线程的同时使用java.util.Random实例可能会遇到争用,从而导致性能下降。 在多线程设计中考虑使用ThreadLocalRandom 。
java.util.Random的java.util.Random不是加密安全的。 考虑使用SecureRandom获取一个加密安全的伪随机数生成器,供安全敏感应用程序使用。
构造函数
Random()
创建一个新的随机数生成器。
源码:
public Random() {
this(seedUniquifier() ^ System.nanoTime()); // 按位异或
}
Random(long seed)
使用单个 long种子创建一个新的随机数生成器。
源码:
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}
}
(1)产生0到9的随机整数:
Random ran = new Random();
int a = ran.nextInt(10);
Random ran = new Random(10); // 10是随机数种子,相同的种子产生相同的一个随机数
int a = ran.nextInt();
关于随机数种子:
你知道uuid吗 这个是以当前系统时间和jvm版本号和ip地址作为种子保证每次产生的随机序列都不一样 所以 uuid产生的随机序列是在整个网络里都是唯一的。
想要获取一个范围内的随机数(例如26,随机数可能是0-25),首先需要一个种子(其实就是一个数值)。 每个种子会对应这个范围内(0-26)的唯一的一个随机数。47这个种子在26这个范围内,所对应的随机数为24,所以每次随机得出的结果都为24。至于为什么种子47会对应24,这个涉及到java封装的算法,有兴趣可以深入了解。
但是大家可能会发现,平常我们生成随机数的时候并没有传那个种子,每次运行出来的结果不一样。如下:
Random r = new Random();
int a = r.nextInt(26);
如果不填种子,则会默认取当前时间的毫秒数作为种子来生成随机数。
(3)利用set集合,获取不重复的一组随机值:
//声明随机数对象
Random r = new Random();
//声明Set集合
Set<Integer> set = new HashSet<>();
while(set.size()!=7){//当set集合的size(大小)小于7时,继续执行循环
int a = r.nextInt(8)+1;//接收随机数对象
set.add(a);//添加随机数
}
System.out.println(set);
set集合元素值唯一,add相同值只保存一份。
最后
以上就是可耐铃铛为你收集整理的java生成随机数方法总结 —— Math类、Random类解析二、通过Random类的全部内容,希望文章能够帮你解决java生成随机数方法总结 —— Math类、Random类解析二、通过Random类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复