题目地址:https://leetcode.com/problems/implement-rand10-using-rand7/description/
题目描述
Given a function rand7
which generates a uniform random integer in the range 1 to 7, write a function rand10
which generates a uniform random integer in the range 1 to 10.
DoNOT use system's Math.random()
.
Example 1:
Input: 1
Output: [7]
Example 2:
Input: 2
Output: [8,4]
Example 3:
Input: 3
Output: [8,1,10]
Note:
1、 rand7ispredefined.;
2、 Eachtestcasehasoneargument:n,thenumberoftimesthatrand10iscalled.;
Follow up:
1、 Whatistheexpectedvalueforthenumberofcallstorand7()function?;
2、 Couldyouminimizethenumberofcallstorand7()?;
题目大意
利用一个范围在1~7的随机数产生器,构造一个范围在1~10的随机数产生器。
解题方法
范围在1~7的随机数产生器,即1~7各个数字出现的概率皆为1/7. 范围在1~10的随机数产生器,即1~10各个数字出现的概率皆为1/10.
这个题的构造思路是先构造一个randN,这个N必须是10的整数倍,然后randN % 10就可以得到了rand10.
所以可以从rand7先构造出rand49,再把rand49中大于等于40的都过滤掉,这样就得到了rand40,在对10取余即可。
具体一点就是:
1、 rand7()等概率地产生1,2,3,4,5,6,7.;
2、 rand7()-1等概率地产生[0,6].;
3、 (rand7()-1)*7等概率地产生0,7,14,21,28,35,42;
4、 (rand7()-1)*7+(rand7()-1)等概率地产生[0,48]这49个数字;
5、 如果步骤4的结果大于等于40,那么就重复步骤4,直到产生的数小于40;
6、 把步骤5的结果mod10再加1,就会等概率的随机生成[1,10];
所以过程是:
rand7 --> rand49 --> rand40 --> rand10.
其中,构造rand49的方式是:
7 * (rand7() - 1) + rand7() - 1
那么,如何理解呢?上面的做法到底如果理解才能记住呢?看下面这个表格:
看上面的表格,可以这么理解:我们先产生[1,49]之间的随机正整数,构建的方式是扔两次rand7()两次的结果分别作为表格的行和列,因此,7 * (rand7() - 1) + rand7()
的取值范围是[1, 49],代表上面表格的任意位置。注意,我们需要把上图黄色部分的给过滤掉,因为这9个数字超出了40的范围,即如果两次扔rand7()产生的数字在上面黄色的部分需要重新扔。得到了[1,49]之后,然后减去1 再 mod 10 再加1即可。
这个方法我觉得最好要记住。
# The rand7() API is already defined for you.
# def rand7():
# @return a random integer in the range 1 to 7
class Solution:
def rand10(self):
"""
:rtype: int
"""
return self.rand40() % 10 + 1
def rand49(self):
"""
random integer in 0 ~ 48
"""
return 7 * (rand7() - 1) + rand7() - 1
def rand40(self):
"""
random integer in 0 ~ 40
"""
num = self.rand49()
while num >= 40:
num = self.rand49()
return num
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
C++代码如下:
// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7
class Solution {
public:
int rand10() {
return rand40() % 10 + 1;
}
int rand49() {
return (rand7() - 1) * 7 + (rand7() - 1);
}
int rand40() {
int r = rand49();
while (r >= 40) {
r = rand49();
}
return r;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发