Random随机数详解(抽奖概率的原理)

java.util.Random是Java中一个可以生成随机数的类,并且你可以通过传入相关参数来对随机数的范围进行控制,无论在实际开发中,还是学习生活中,Random随机数都能起到比较大的作用。那么今天就来学习一下Random的使用!

相信你肯定抽过奖!那么作为一个程序员,你有没有想过那些抽奖的大转盘,或者是九宫格是怎么实现的呢?又是怎么控制中奖概率的呢?跟着我的脚步,我带你领略Random的风骚!

实例化对象

通过源码可以看到Random类是有两个构造方法的,其中一种是不带参的,还有一种是带有一个long类型参数(称为:种子)的,那么这两种有何区别呢?

不带参:完全随机

带参:传入参数(种子)的Random对象所生成的随机数是固定的

举个栗子,当你实例化两个Random对象时,如果参数(种子)都传入10,那么这两个Random(random1 和 random2)对象所生成的随机数,random1生成的第一个随机数 = random2生成的第一个随机数 ,random1生成的第二个随机数 = random2生成的第二个随机数 ,代码如下:

        //实例化Random对象
        Random random = new Random();
        Random random2 = new Random();
        
        Random random3 = new Random(10);
        Random random4 = new Random(10);

 
        for (int i = 0; i < 10; i++) {
            int number=random.nextInt();
            int number2=random2.nextInt();
            int number3=random3.nextInt();
            int number4=random4.nextInt();
            //输出格式是:  无种子随机数  无种子随机数  有种子随机数  有种子随机数
            System.out.println(number+"_"+number2+"___"+number3+"_"+number4);
        }

输出结果:

1075217332 -2135067742 -1157793070 -1157793070
-944171219 -837885942 1913984760 1913984760
1314450533 1413088185 1107254586 1107254586
215653709 -337612687 1773446580 1773446580
1737734575 1766714434 254270492 254270492

从输出的五组数来看,可以明显地发现,无种子随机数生成的随机数是完全随机的(没有任何联系),而传入了种子的两个random对象所生成的随机数是一样的,得出结论:传入种子的Random对象所生成的随机数是固定的

注意:种子不会影响随机数的范围

常用方法

Random的几个常用方法都比较简单,这里只列举三种最常用的。

生成 int 类型随机数

这里演示获取多种类型的 int 数据的方法:默认范围 [int最小值,int最大值) 、0~最大范围 [0,max) 、自定义范围 [min , max) 、自定义范围 [min , max] ,当然了这里只演示几种最常用的,还有很多其他类型的,都可以通过不同的公示来进行改变

//生成默认范围(int类型的范围)的随机数
int i = random.nextInt();//[int最小值,int最大值)

//生成自定义 0~最大范围(max)的正整数随机数 [0,max)
int i = random.nextInt(max);//[0,10)

//生成自定义范围随机数 [min , max) 
//公式:  .nextInt(max) % (max - min) + min
int i=random.nextInt(10)%(10-5)+5;//[5,10)

//生成自定义范围随机数 [min , max]
//公式:  .nextInt(max) % (max - min + 1) + min
int i = random.nextInt(10) % (10 - 5 + 1) + 5;//[5,10]

生成 boolean 类型随机数

这个很好理解,就是直接生成 true 和 false 中的一个,概率相同

boolean b = random.nextBoolean();

生成 double 类型随机数

nextDouble()生成的随机数范围是 [0 , 1.0) 的小数

double d = random.nextDouble();

随机数的几种常用用途

随机数在很多地方都用得到,我个人最常见的就是应用在抽奖中了,一个抽奖程序,想要控制各种奖项的概率,用随机数来做再合适不过了!

中奖概率的控制:

中奖概率控制原理:通过获取随机数,然后利用 if 语句先限定中奖的区间,就可以达到一个公平的概率效果!

        //首先在 [1,100] 区间(100个数)随机获取一个数
        int i = random.nextInt(100) % (100 - 1 + 1) + 1;
        System.out.println("当前获取的随机数:" + i);
        //然后根据中间概率来设置 if 条件语句的区间,达到效果
        if (i >= 80) {// [80,100] 一等奖
            System.out.println("恭喜,一等奖!");
        } else if (i >= 50) { // [50,80] 二等奖
            System.out.println("恭喜,二等奖!");
        } else {//[1,50]  谢谢惠顾
            System.out.println("很遗憾,没有中奖!");
        }

骰子的制作:

        //首先在 [1,6] 区间(6个数)随机获取一个数
        int i = random.nextInt(6) % (6 - 1 + 1) + 1;
        System.out.println("骰子点数:" + i);  

硬币正反面也是同理,这里面随机数的区间以及中奖的概率都可以根据实际需要来做调整!

原创文章 50 获赞 334 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_44720366/article/details/105798406