解答
解法:通过random3生成random9 step2: 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之间输出即可。由于题目并没有要求每次生成的时间相同,而只是概率相同,这样的方法是满足题目要求的。
举一反三,random x生成random y的套路如下:
如果x > y,那么直接多次执行random x,剔除大于y的结果即可。 如果x < y,那么借助区间,生成 random x^2,判断x ^2是否 < y,如果还小,那么继续生成 random x^4,直到区间大于y即可。
js伪代码如下:
random3;
function random9() {
const a = random3();
const b = random3();
const c = (a - 1) * 3 + b;
return c;
}
function random7() {
let res = random9();
while (res > 7) {
res = random9();
}
return res;
}
真棒!茅塞顿开的感觉。
太强了,学完框架再回来看