470. 用 Rand7() 实现 Rand10() 【中等题】【概率】
曾经面美团的时候被问了一道概率题,后来在刷题的时候发现是leetcode的470题,特此拿出来和大家探讨。
已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
- 不要使用系统的 Math.random() 方法
- rand7()已经定义,返回一个 1 到 7 范围内的均匀随机整数,可以直接调用
题目讲解
方法一:拒绝采样
【历史重难点题目】
【核心思想】
- 合理调用rand7()来生成rand10()
- 先举一个简单的例子,如何用rand7()来生成rand5()呢?用rand7()产生一个随机数,如果随机数是
1,2,3,4,5
就取,是6,7
就重新生成。因为rand7()生成1,2,3,4,5
的概率是一样的,都是 1 7 \frac{1}{7} 71,所以rand5()也是均分分布的。
【思路】
- 把rand7()想象成一个7面的骰子🎲,现在我们有两个骰子
- 第一次如果掷出
1,2,3,4,5,6
就掷下一个骰子;如果掷出7
,就继续掷这个骰子,直到不是7为止 - 第二次如果掷出
1,2,3,4,5
就结束;如果掷出6,7
,就继续掷这个骰子,直到不是6,7
为止 - 如果第一次掷出
1,2,3
,则first记为0;如果第一次掷出4,5,6
,则记first为5;记第二次掷出的为second - 最后返回
first+second
验证一下是否是均匀分布:
first为0的概率=第一次掷出1,2,3
的概率= 3 7 \frac{3}{7} 73
first为5的概率=第一次掷出4,5,6
的概率= 3 7 \frac{3}{7}