已知方法f1方法,提供1,2,3,4,5随机正整数,概率相等.
改为生成0,1,2,3,4,5,6,7随机正整数方法
思路:
方法f1(){
//生成随机数 1,2,3,4,5
//用Math.生成即可,
}
方法f2(){
Bolflag=True;
死循环while(){
调用 a=f1();
if(1和2-->0)
if(4和5-->1)
if(3,再次生成随机数)
如果得到的是0/1就输出,否则就继续循环
}
}
方法f3(){
//连续三次调用[f2(),f2(),f2()] ,作为二进制看待.[0/1,0/1,0/1],即可得0~7随机数
a = f2();
b = f2();
c = f2();
[a,b,c]
if(a==0,b==0,c==0){
return 0;
}if(a==1,b==1,c==0){
return 6;
}//以此类推
}
f4(){
for(int i=0;i<10000;i++){
//循环调用f3()
//看得到的是几?
//写个count0~7,记录被调用的次数
//看下是不是每个数字被调用额概率一致
}
}
以下代码直接复制运行即可!
import org.junit.Test;
import java.util.Arrays;
/** 用随机数1~5,生成随机数1~7 */
public class Code02Test {
int f1() {
// 返回1~5随机数
return (int) (Math.random() * 5) + 1;
}
/**
* @return 返回数据0/1
*/
int f2() {
int f1 = 0;
do {
f1 = f1();
} while (f1 == 3);
return f1 < 3 ? 0 : 1;
}
/**
* @return 返回数据0~7
*/
int f3() {
return (f2() << 2) + (f2() << 1) + (f2());
}
/**
* @return 0~6等概率返回
*/
public int f4() {
int f3 = 0;
do {
f3 = f3();
} while (f3 == 7);
return f3;
}
/**
* @return 返回1~7
*/
public int g() {
return f4() + 1;
}
@Test
public void test() {
int[] counts = new int[9];
for (int i = 0; i < 100000; i++) {
int g = g();
counts[g]++;
}
System.out.println(Arrays.toString(counts));
}
}
/*[0, 14193, 14242, 14098, 14267, 14497, 14232, 14471, 0]
0数字出现了0次
1数字出现了14193次
2数字出现了14242次
3数字出现了14098次
4数字出现了14267次
5数字出现了14497次
6数字出现了14232次
7数字出现了14471次
8数字出现了0次*/
心得: 从a~b,得到c~d
先把a~b,分成0/1,偶数就直接分,奇数就选中间数再查一次.
然后看c(5)~d(64)范围,假如是(60)位,那就_._._._,四个二进制位数,然后查4次,得到0000~1111;0~63
然后(0~63)+5,就是(5~68),其中,大于64的,再重复筛查.直到得到想要的数据