470. 用 Rand7() 实现 Rand10()
已有方法 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() ?
分析
拒绝采样
rand7生成1-7中随机数,那我们就可以用2个rand7生成1-49中的随机数(注意不能使用rand7() * rand7(),这样生成的数不是随机的,例如7*6和6*7都是42,概率为2/49,而生成1只有1*1,概率为1/49),乘法即使加法,我们可以用1-7去填充每7个空挡,空挡前置基数由[0,7,14,21,28,35,42],填充7次,即得1-49中每个数生成的概率都是1/49。然后拒绝采样,得到前40个数,[1-10,11-20,21-30,31-40],将每个数-1,然后取余10,即得到随机的[0-9], 每位数再加1,得到[1-10]。
var rand10 = function () {
let sum;
while ((sum = rand7() + (rand7() - 1) * 7) > 40);
return (sum - 1) % 10 + 1
}
古典概型
古典概型也叫传统概率、其定义是由法国数学家拉普拉斯 (Laplace ) 提出的。如果一个随机试验所包含的单位事件是有限的,且每个单位事件发生的可能性均相等,则这个随机试验叫做拉普拉斯试验,这种条件下的概率模型就叫古典概型。
在这个模型下,随机实验所有可能的结果是有限的,并且每个基本结果发生的概率是相同的。古典概型是概率论中最直观和最简单的模型,概率的许多运算规则,也首先是在这种模型下得到的。
- 古典概型的特点
有限性(所有可能出现的基本事件只有有限个)
等可能性(每个基本事件出现的可能性相等)
- 基本事件的特点
(1)任何两个基本事件是互斥的。
(2)任何事件(除不可能事件)都可以表示成基本事件的和。
根据古典概型的特点,我们可以得出,rand10可以由任意两个基本事件的和表示,即可以是2个rand5,并且这两个rand5要是互斥的。所以我们可以用一个rand2去区分这两个rand5。当为奇数时用[1-5]的rand5,偶数时使用[6-10]的rand5。rand2可以使用rand7拒绝采样,当不为7时,奇偶概率相同。rand5拒绝采样6和7。
var rand10 = function () {
let r2 = rand7(), r5 = rand7();
while (r2 === 7) {
r2 = rand7()
}
while(r5 > 5) {
r5 = rand7()
}
return r2 % 2 === 0 ? r5 : (5 + r5)
};