第53天。
今天的题目是Implement Rand10() Using Rand7()
如果我们是用Rand10()
去实现Rand7()
的话就简单,因为 10 比 7 大,所以:
1int rand7() {2 int r;3 while((r = rand10) > 7);4 return r;5}
但是题目是用Rand7()
去实现Rand10
,所以我们需要转换一下。
由于1/10 = 1/2 * 1/5
,所以我们可以用rand5()
和rand2()
来实现rand10()
,而rand5()
和rand2()
又可以用rand7()
来实现,所以:
1int rand10() {2 return rand5() + 5 * (rand2() - 1);3}4int rand2() {5 int r;6 while((r = rand7()) > 2) {7 }8 return r;9}10int rand5() {11 int r;12 while((r = rand7()) > 5) {13 }14 return r;15}
其期望为7/2 + 7/5
,所以调用rand7()
的次数会比较大,我们可以用rand7()
去实现rand49()
,由于49 = 7 * 7
,所以我们只需要调用两次rand7()
即可实现出rand49()
然后用rand49()
去实现一个rand40()
,而rand40() % 10 + 1
即实现了rand10()
:
1int rand10() {2 int r;3 while((r = rand49()) > 40);4 return r % 10 + 1;5}6int rand49() {7 return (rand7()-1)*7 + rand7();8}