已有方法 rand7
可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10
生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random()
方法。
示例 1:
输入: 1 输出: [7]
示例 2:
输入: 2 输出: [8,4]
示例 3:
输入: 3 输出: [8,1,10]
提示:
rand7
已定义。- 传入参数:
n
表示rand10
的调用次数。
进阶:
rand7()
调用次数的 期望值 是多少 ?- 你能否尽量少调用
rand7()
?
方法一:拒绝采样
用拒绝采样的方法实现 Rand10()。在拒绝采样中,如果生成的随机数满足要求,那么久返回该随机数,否则会不断生成直到一个满足要求的随机数为止。若调用两次 Rand7(),可以生成 [1, 49] 之间的随机整数,只用到其中的 40 个,用来实现 Rand10(),而拒绝剩下的 9 个数,如下图所示。
计算该方法在平均情况下需要调用 Rand7() 的次数。
这里称连续调用两次 Rand7() 为一轮。在第一轮中,有 40/49 的概率不被拒绝,而有 9/49 的概率被拒绝,进入第二轮。在第二轮中也是如此,因此调用 Rand7() 的期望次数为:
推导:平均需要的轮数计算为
因此,平均轮数为
另一种计算方法:假设平均需要E轮,则有