leetcode — 470. 用 Rand7() 实现 Rand10()

        已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。

不要使用系统的 Math.random() 方法。

示例 1:

输入: 1
输出: [7]

示例 2:

输入: 2
输出: [8,4]

示例 3:

输入: 3
输出: [8,1,10]

提示:

  1. rand7 已定义。
  2. 传入参数: n 表示 rand10 的调用次数。

进阶:

  1. rand7()调用次数的 期望值 是多少 ?
  2. 你能否尽量少调用 rand7() ?

方法一:拒绝采样

        用拒绝采样的方法实现 Rand10()。在拒绝采样中,如果生成的随机数满足要求,那么久返回该随机数,否则会不断生成直到一个满足要求的随机数为止。若调用两次 Rand7(),可以生成 [1, 49] 之间的随机整数,只用到其中的 40 个,用来实现 Rand10()而拒绝剩下的 9 个数,如下图所示。

pic

        计算该方法在平均情况下需要调用 Rand7() 的次数。

        这里称连续调用两次 Rand7() 为一轮。在第一轮中,有 40/49 的概率不被拒绝,而有 9/49 的概率被拒绝,进入第二轮。在第二轮中也是如此,因此调用 Rand7() 的期望次数为:

\large \begin{aligned} E(\text{\# calls}) &= 2 + 2 \cdot \frac{9}{49} + 2 \cdot (\frac{9}{49})^2 + \cdots\\ &= 2 \sum_{n=0}^\infty (\frac{9}{49})^n\\ &= 2 \cdot \frac{1}{1 - \frac{9}{49}}\\ &=2.45 \end{aligned}  


        推导:平均需要的轮数计算为

\large P(need-N-time)=\frac{40}{49}\times \left(\frac{9}{49}\right)^{n-1}

因此,平均轮数为

\large \sum_{n=1}^{\infty}\frac{40}{49}\times \left(\frac{9}{49}\right)^{n-1}\times n=\frac{40}{49}\times \frac{1}{\left(1-9/49\right)^2}=\frac{1}{40/49}
 

另一种计算方法:假设平均需要E轮,则有

\large E=\frac{40}{49}\times 1+\frac{9}{49}\left(1+E\right)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值