写点什么

浅谈 Java 中的 Math.random

作者:秋名山码民
  • 2022 年 5 月 08 日
  • 本文字数:1016 字

    阅读完需:约 3 分钟

Math.random()是 java 内置产生随机数的函数,Math.random()能够产生[0,1)的浮点数

//随机函数        System.out.println("测试开始");        //返回double类型,double-》[0,1)等概率一个数        int testTimes = 100000;        int counts = 0;        for (int i = 0; i < testTimes; i++) {            if (Math.random() < 0.3) {                counts++;            }        }
复制代码


我们通过测试可以看到,是随机的,小于 0.3 的概率基本就是 0.3


那么,如果我要生成从[0,8)的随机数呢?

//[0,1) * 8-> [0,8) double ans1 = Math.random() * 8;
复制代码

左边不包含 8,要使得左边包含 8,我们可以这样来看,注意本身的 Math.random 函数,返回的是 double 类型,这里要有一个强制转换为 int 类型

int k = 9; //[0,k)  -> [0,k-1]
int[] count = new int[9];for (int i = 0; i < testTimes; i++) { int ans2 = (int) (Math.random() * k); count[ans2]++;}for (int i = 0; i < k; i++) { System.out.println(i + "这个数出现了" + count[i] + "次");}
复制代码

如果想让概率改变,例如:将出现 x 的概率变成 x^2,可以结合独立事件来思考

counts = 0;double x = 0.1;for (int i = 0; i < testTimes; i++) {     if (xToPower2() < x) {//由原来的x,变成x^2          counts++;     }}System.out.println((double) counts / (double) testTimes);System.out.println(Math.pow(x, 2));    //概率调整成x^2    //任意的x,x属于【0,1),【0,x)范围上出现的概率由原来的x调整位x平方public static double xToPower2() {    return Math.max(Math.random(), Math.random());}
复制代码

思考这样一个情形:

当一个问题中,每个只能出现一次,俩个不同颜色小球,进行抽取(不放回抽取),抽象为 0,1

意思是只可能有 0,1 或 1,0 的情况出现,,就是高中的排列问题,以下是模拟代码:

    //不等概率随机 p和1-p    //1,1和0,0这种都删了,不满足    public static int x() {        return Math.random() < 0.84 ? 0 : 1;    }
//等概率返回0和1 public static int y(){ int ans = 0; do{ ans = x(); }while(ans == x());//如果第一次等于第二次,重做
return ans; }
复制代码


最后再介绍一个 random 的 nextInt()函数

  random.nextInt(a)产生[0-a)的随机数

 如要产生[5-15]的随机数:

Random a = new Random();
int i=a.nextInt(11)+5
复制代码


发布于: 刚刚阅读数: 2
用户头像

卷不死,就往…… 2021.10.19 加入

2019NOIP退役成员,华为云享专家,阿里云专家博主,csdn博主,努力进行算法分享,有问题欢迎私聊

评论

发布
暂无评论
浅谈Java中的Math.random_java_秋名山码民_InfoQ写作社区