一、 f1() = {1,2,3,4,5} f1提供一个等概率的返回一到五的方法 根据f1写出 1~7之间返回等概率的方法。
做这个类型的题目: 提供一个等可能范围、 根据提供的等可能范围求其它范围
① 根据提供的等可能范围求出一个 0 1 等可能
/**
* 构造出 f2 等概率返回 0 1
* f1 概率返回 1- 5 所以出现各个数的概率为 20%
* 所以 1 - 2 的概率 共: 40% 4 - 5 的概率 共:40%
* 当 ans == 3 时 就将3的概率分为四份 分给 1-2 和 4-5
* 最后就会变成 1-2 出现的概率 50% 4-5 出现的概率 50%
* @return
*/
public static int f2(){
int ans = 0;
do {
ans = f1();
} while (ans == 3);
return ans < 3 ? 0: 1;
}
② 判断需要到求的范围 例: [x,y] 范围的等可能概率,我们可以构造出 [x-x,y-x] 也就是 [0,y-x]上的等可能,就可以得到我们想要的 [x, y]范围。
/**
* 根据 f2 构造出 1~7 等概率返回方法 g()
* @return
*/
public static int g(){
int ans;
do {
/*
f2() << 2 第三个二进制位
f2() << 1 第二个二进制位
f2() 第一个二进制位
而三个二进制位组合成的 01 范围 000 ~ 111 也就是 0 ~ 7
*/
ans = (f2() << 2) + (f2() << 1) + f2();
/*
ans == 0 将其平均分配给 1~7 则就能返回 1~7等概率随机数
*/
}while (ans == 0);
return ans;
}
完整代码
package random;
/** 1. f1() = {1,2,3,4,5} f1提供一个等概率的返回一到五的方法
* 根据f1写出 1~7之间返回等概率的方法
* 2. a1() = {0, 1} 不等概率 求返回一个 等概率的方法
* @author codelmh
* @data 2021/12/6
*/
public class num {
public static void main(String[] args) {
int[] count = new int[8];
int max = 1000000;
for ( int i = 0; i < max; i++){
count[g2()] ++;
}
for (int i = 0; i < count.length; i++){
System.out.println("出现 " + i + "的概率" + (double)count[i]/max);
}
}
/**
* g2 等概率返回 0 1
* @return
*/
public static int g2(){
int ans;
do {
ans = a1();
} while (ans == a1());
return ans;
}
/**
* 不等概率返回 0 1
* @return
*/
public static int a1(){
return Math.random() < 0.65 ? 0 : 1;
}
/**
* 根据 f2 构造出 1~7 等概率返回方法 g()
* @return
*/
public static int g(){
int ans;
do {
/*
f2() << 2 第三个二进制位
f2() << 1 第二个二进制位
f2() 第一个二进制位
而三个二进制位组合成的 01 范围 000 ~ 111 也就是 0 ~ 7
*/
ans = (f2() << 2) + (f2() << 1) + f2();
/*
ans == 0 将其平均分配给 1~7 则就能返回 1~7等概率随机数
*/
}while (ans == 0);
return ans;
}
/**
* 构造出 f2 等概率返回 0 1
* f1 概率返回 1- 5 所以出现各个数的概率为 20%
* 所以 1 - 2 的概率 共: 40% 4 - 5 的概率 共:40%
* 当 ans == 3 时 就将3的概率分为四份 分给 1-2 和 4-5
* 最后就会变成 1-2 出现的概率 50% 4-5 出现的概率 50%
* @return
*/
public static int f2(){
int ans = 0;
do {
ans = f1();
} while (ans == 3);
return ans < 3 ? 0: 1;
}
/**
* 等概率返回 1 ~ 5
* @return 1 ~ 5
*/
public static int f1(){
return (int) (Math.random() * 5) + 1;
}
}