02有一个可以等概率生成随机数1-3的函数,random3,要求写出一个可以生成random7的函数,可以等概率的生成数字1-7
解法:通过random3生成random9step2:random9中剔除大于7,即可生成random7。其中,第一步可能相对有点绕,如何通过random3生成random9,可以分两步:第一步:执行一次random3,得到的结果称为a第二步:再执行一次random3,得到的结果称为b第三步:将第一步得到的a想像成1-9中的[1-3],[4-6],[7-9]区间,如果a为1,那么表示结果落在第一个区间,具体是1-3中的哪个数字,由数字b决定,用公示表示,即结果c=(a-1)*3+b而从random9生成random7,只需要不断循环,如果结果小于等于7,那么输出,否则再次循环,直到结果落在1-7之间输出即可。由于题目并没有要求每次生成的时间相同,而只是概率相同,这样的方法是满足题目要求的。举一反三,randomx生成randomy的套路如下:如果x>y,那么直接多次执行randomx,剔除大于y的结果即可。如果x<y,那么借助区间,生成randomx^2,判断x^2是否<y,如果还小,那么继续生成randomx^4,直到区间大于y即可。js伪代码如下:random3;functionrandom9(){consta=random3();constb=random3();constc=(a-1)*3+b;returnc;}functionrandom7(){letres=random9();while(res>7){res=random9();}returnres;}
来自:智力分析问题-智力分析题