「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给定方法 rand7
可生成 [1,7]
范围内的均匀随机整数,试写一个方法 rand10
生成 [1,10]
范围内的均匀随机整数。
你只能调用 rand7()
且不能调用其他方法。请不要使用系统的 Math.random()
方法。
每个测试用例将有一个内部参数 n
,即你实现的函数 rand10()
在测试时将被调用的次数。请注意,这不是传递给 rand10()
的参数。
示例 1:
输入: 1
输出: [2]
复制代码
示例 2:
输入: 2
输出: [2,8]
复制代码
示例 3:
输入: 3
输出: [3,8,10]
复制代码
提示:
1 <= n <= 105
解题思路
-
这题我们将用到拒绝采样的思想,这个也对听上去挺难理解的,其实并不复杂,我们先简单认识一下
-
因为我们获取到
[1,7]
的概率是相同的,那么我们先拒绝7
的采样,获取到[1,6]
这样的数组,其中奇数偶数各一半,概率为1/2
-
接下来我们拒绝
6、7
的采样,获取到[1,5]
的概率相同,分别为1/5
-
用第一次采样的奇偶性来判断第二次采样的结果是否需要
+5
解释一下拒绝采样----> 当采样到我们拒绝到数时候,重新生成
解题代码
// 1. 第一次rand7限定[1,6],判断奇偶性,概率是1/2
// 2. 第二次rand7限定[1,5],概率是1/5
// 3. 二者结合可以得出10种概率相同的结果
var rand10 = function() {
let first,second
while((first=rand7())>6); // 拒绝7 限定[1,6]
while((second=rand7())>5); // 拒绝 6,7 限定[1,5]
return first%2?second:5+second
};
复制代码
我和你在这里初见,是故事里的人间,是人间里的少年,如果我们就此分别,那你应该永远都是我灯火阑珊处惊鸿的一眼,一眼就是万年。
如有任何问题或建议,欢迎评论区留言讨论!