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