随机盒子

随机盒子–小修改

已知[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("--------------------------------------------------------");
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值