[路飞][LeetCode]470_用 Rand7() 实现 Rand10()

「这是我参与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
};
复制代码

我和你在这里初见,是故事里的人间,是人间里的少年,如果我们就此分别,那你应该永远都是我灯火阑珊处惊鸿的一眼,一眼就是万年。

如有任何问题或建议,欢迎评论区留言讨论!

おすすめ

転載: juejin.im/post/7061964932195024910