用rand7() 实现 rand10()

题目:

已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数。

思路:

假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢?

方法一:

rand10可以通过对10取余+1得到。rand7()-1产生0~6,7*(rand7()-1)产生[0,7,14,21,28,35,42],再加rand7()-1得到0~49,舍去大于等于40的部分即可。

int rand10() {
        int res = 40;
        while (res >= 40)
            res = 7 * (rand7() - 1) + (rand7() - 1); 
        return res % 10 + 1;
    }

方法二:

//为了方便,粘贴自评论区。
/*
    a    1    2    3    4    5    6    7
b                                
1        2    3    4    5    6    7    8
2        3    4    5    6    7    8    9
3        4    5    6    7    8    9    0
4        5    6    7    8    9    0    1
5        6    7    8    9    0    1    2
6        7    8    9    0    1    2    3
7        8    9    0    1    2    3    4

去掉右上角的  
6    7    8
7    8    9
8    9    0      后
每个数字的出现次数为4次,0-9的概率相同
*/
int rand10() {
        int a = rand7(), b= rand7();
        while( 1){
            if( !(a > 4 && b < 4))
                break;
            a = rand7(), b= rand7();
        }
            
        return (a+b) %10 + 1;
    }

 

posted @ 2020-09-14 19:59  r1-12king  阅读(421)  评论(0编辑  收藏  举报