rand5() 和 rand7()相互生成

解题思路:

  此类型题目的解题主要注意生成的各个数字都是等概率的,不能够使用取模等操作,因为会造成概率不均匀

  rand7()生成rand5():

    rand7()的随机数概率分布是1/7,我们在用其生成rand5()的时候只需要获取1 2 3 4 5 五个即可,其余两个数 6 7 忽略 也就是:

    结果取res = (1~51)有效 (否则重新计算

1 public int rand5byrand7(){
2         int r = (int)(Math.random()*(7-1)+1);
3         while(r > 5){
4             r = (int)Math.random()*(7-1)+1;
5         }
6         return r;
7     }

 

 

  rand5()生成rand7():

    rand5()主要生成1 2 3 4 5(等概率) ,

    5*rand5()生成 5 10 15 20 25(等概率)

    5*(rand5()-1) 主要生成0 5 10 15 20(等概率)

    5*(rand5()-1) + rand5() 主要生成1~25并且是等概率的

    之后只用取1~7即可(因为1~7的话8~25抛弃,会降低有效速度),因此,我们设置每三位代表一个数

    1~3(1) 4~6(2) ...19~21(7)之后的全部抛弃 也就是:

    结果取res = (1~21)有效(否则重新计算) , ceil(res/3) 向上取整

    

1  public int rand7byrand5(){
2         int r = 5*((int)(Math.random()*(5-1)+1) - 1) + (int)(Math.random()*(5-1)+1);
3         while(r > 21){
4              r = 5*((int)(Math.random()*(5-1)+1) - 1) + (int)(Math.random()*(5-1)+1);
5         }
6         return (int) Math.ceil( r/3.0);
7     }

 

    

posted @ 2019-09-27 19:43  十指决  阅读(713)  评论(0编辑  收藏  举报