算法-练习:1~5随机正整数,生成随机正整数1~7

已知方法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(12-->0)
		if(45-->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,再重复筛查.直到得到想要的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值