java生成随机数方法总结 —— Math类、Random类解析

一、通过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相同值只保存一份。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitemeen太白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值