470.用Rand7()实现Rand10()Java
题目描述
已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random() 方法
输入输出样式
示例1:
输入: 1
输出: [7]
示例2:
输入: 3
输出: [8,1,10]
本题来自LeetCode:https://leetcode-cn.com/problems/implement-rand10-using-rand7/
思路
这里采用了拒绝采样的方法,即如果生成的随机数满足要求则输出,如果生成的随机数不满足要求则不断生成,直到其满足要求为止。
算法分析
时间复杂度O(1),空间复杂度为O(1)
求解函数
public int rand10() {
int rst = 49;
while (rst > 40) {
//这个公式可以等概率地生成随机数
//这里能等概率生成的范围为0 - 49
rst = 7 * (rand7() - 1) + rand7();
}
return rst % 10 + 1;
}