已知[a,b]等概率随机
求[c,d]随机(不能用随机函数)
//随机盒子:
//从a~b随机到c~d随机
public static int a;
public static int b;
public static int c;
public static int d;
public static int RandomBox(int a,int b,int c,int d){
return g4() + c;
}
public static int g1(){
return ((int) (Math.random() * (b-a+1))) + a;//生成[a,b] 整数,等概率
}
public static int g2(){
int ans;
if ((b-a) % 2 == 0 ){
do{
ans = ((int) (Math.random() * (b-a+1))) + a;
}while(ans == (a+b)/2);
}else{
ans = ((int) (Math.random() * (b-a+1))) + a;
}
return (ans <= (a+b)/2) ? 0 : 1;//等概率 0,1
}
//0~(d-c) 等概率
public static int g3(){
int ans = 0;
int len = (int)(Math.log((d-c)+1)/Math.log(2.0));
for (int i= 0; i <= len;i++){
ans += (g2()<<i);
}
return ans;
}
public static int g4(){
int ans = g3();
while ( ans > (d-c)){
ans = g3();
}
//System.out.println(ans);
return ans;
}
public static void main(String[] args) {
int testTimes = 1000000;
int testTime2 = 1000000;
int N = 100;
int M = 1000;
for (int j = 0; j < testTime2; j++){
a = (int)(Math.random()*N);
b = a + (int)(Math.random()*N) + 1;
c = (int)(Math.random()*M);
d = c + (int)(Math.random()*M) + 1;
int[] counts = new int[d-c+1];
for (int i = 0; i < testTimes;i++){
counts[RandomBox(a,b,c,d)-c]++;
}
for (int i = 0; i < counts.length; i++){
System.out.println("数字" + (i+c) + "出现了" + counts[i] + "次");
}
System.out.println("--------------------------------------------------------");
}
}