100道面试必会算法-07-用 Rand7() 实现 Rand10()
题目描述
给定方法 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:与正确答案类似但不知道怎么处理,将 rand7()*rand7()
然后就想办法把取值放在1-10之间,但没有好的方法
2:第二个方法就更取巧了,把rand7()
进行放大,rand7()*1.5然后再向下取整(强制转换为整形刚刚好)但好像没办法取到3,就改乘1.45,取到了但测试不通过。
上述不通过原因应该是概率问题,本来是1-7我只用一个rand将其放大到1-10,概率不为均等(猜测,八九不离十吧)
好心的大佬的思路如下:
- 传送门https://leetcode.cn/problems/implement-rand10-using-rand7/solutions/139870/xiang-xi-si-lu-ji-you-hua-si-lu-fen-xi-zhu-xing-ji/
最终代码
public int rand10() {
while (true){
int num = (rand7() - 1) * 7 + rand7();
// 如果在40以内,那就直接返回
if(num <= 40) return 1 + num % 10;
// 说明刚才生成的在41-49之间,利用随机数再操作一遍
num = (num - 40 - 1) * 7 + rand7();
if(num <= 60) return 1 + num % 10;
// 说明刚才生成的在61-63之间,利用随机数再操作一遍
num = (num - 60 - 1) * 7 + rand7();
if(num <= 20) return 1 + num % 10;
}
}
路漫漫其修远兮,吾将上下而求索