Java 随机数、概率实现——Random类

前言:Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同,这点在生成多个随机数字时需要特别注意下面分三部分来讲解一下Random类的使用,以及如何生成指定区间的随机数组以及实现程序中要求的几率。

一、Random类两个构造方法

1、public Random()该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。

2、public Random(long seed)该构造方法可以通过制定一个种子数进行创建。

示例代码:

Random r = new Random();
Random r1 = new Random(10);

再次强调:种子数只是随机算法的起源数字,和生成的随机数字的区间无关。


二、Random类中的常用5种方法:

Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的。

1、public boolean nextBoolean():

该方法的作用是生成一个随机的boolean值,生成true和false的值几率相等,也就是都是50%的几率。

2、public double nextDouble():

该方法的作用是生成一个随机的double值,数值介于[0,1.0)之间。

3、public int nextInt():

该方法的作用是生成一个随机的int值,该值介于int的区间,也就是-231到231-1之间。

如果需要生成指定区间的int值,则需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。

4、public int nextInt(int n):

该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,

包含0而不包含n。如果想生成指定区间的int值,也需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。

5、public void setSeed(long seed):

该方法的作用是重新设置Random对象中的种子数。

设置完种子数以后的Random对象和相同种子数使用new关键字创建出的Random对象相同。

三、常见使用示例(重点):

首先,初始化一个对象:Random r = new Random();
1、生成[0,1.0)区间的小数:
double d1 = r.nextDouble();

2、生成[0,5.0)区间的小数:将该区间扩大5倍即是要求的区间。
double d1 = r.nextDouble();

3、生成[1,2.5)区间的小数:只需要首先生成[0,1.5)区间的随机数字,然后将生成的随机数区间加1即可。
double d3 = r.nextDouble() * 1.5 + 1;

4、生成任意整数:直接使用nextInt方法即可。
int n1 = r.nextInt();

5、生成[0,10)区间的整数:
int n2 = r.nextInt(10);
n2 = Math.abs(r.nextInt() % 10);
6、生成[-3,15)区间的整数:
int n4 = r.nextInt(18) - 3;

7、几率实现:
在前面的方法介绍中,nextInt(int n)方法中生成的数字是均匀的,也就是说该区间内部的每个数字生成的几率是相同的。
比如生成一个[0,100)区间的随机整数,则每个数字生成的几率应该是相同的,而且由于该区间中总计有100个整数,
所以每个数字的几率都是1%。按照这个理论,可以实现程序中的几率问题。

题目:如何写出随机生成一个整数,该整数以55%的几率生成1,以40%的几率生成2,以5%的几率生成3,Java代码?
int n5 = r.nextInt(100);
int m; //结果数字
if(n5 < 55){ //55个数字的区间,55%的几率
    m = 1;
}else if(n5 < 95){//[55,95),40个数字的区间,40%的几率
    m = 2;
}else{
    m = 3;
}

分析:因为每个数字的几率都是1%,则任意55个数字的区间的几率就是55%,为了代码方便书写,这里使用[0,55)区间的所有整数。原理都一样。
当然,这里的代码可以简化,因为几率都是5%的倍数,所以只要以5%为基础来控制几率即可,下面是简化的代码实现:
int n6 = r.nextInt(20);
int m1;
if(n6 < 11){
    m1 = 1;
}else if(n6 < 19){
    m1 = 2;
}else{
    m1 = 3;
}

四、常见问题:

1、相同种子数Random对象问题:
测试代码:
import java.io.*;
import java.util.Random;
class test  
{
	public static void main (String[] args) throws java.lang.Exception
	{
         Random r1 = new Random(10);
         Random r2 = new Random(10);
         for(int i = 0;i < 2;i++){
             System.out.println(r1.nextInt());
             System.out.println(r2.nextInt());
         }
	}
}

输出结果:完全相同!
-1157793070
-1157793070
1913984760
1913984760

分析:在该代码中,对象r1和r2使用的种子数都是10,则这两个对象相同次数生成的随机数是完全相同的。

如果想避免出现随机数字相同的情况,则需要注意,无论项目中需要生成多少个随机数字,都只使用一个Random对象即可。


2、关于Math类中的random方法:(代码习惯)

其实在Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。

通过阅读Math类的源代码可以发现,Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。

只是random方法的调用比较简单,所以很多程序员都习惯使用Math类的random方法来生成随机数字。



觉得有用,请点个赞。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

艾阳Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值