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
复制代码
评论