Code & Func
2020-01-02

第53天。

今天的题目是Implement Rand10() Using Rand7()

如果我们是用Rand10()去实现Rand7()的话就简单,因为 10 比 7 大,所以:

1
int 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()来实现,所以:

1
int rand10() {
2
return rand5() + 5 * (rand2() - 1);
3
}
4
int rand2() {
5
int r;
6
while((r = rand7()) > 2) {
7
}
8
return r;
9
}
10
int 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():

1
int rand10() {
2
int r;
3
while((r = rand49()) > 40);
4
return r % 10 + 1;
5
}
6
int rand49() {
7
return (rand7()-1)*7 + rand7();
8
}
上一条动态