题目:
给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。
你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。
每个测试用例将有一个内部参数 n,即你实现的函数 rand10() 在测试时将被调用的次数。请注意,这不是传递给 rand10() 的参数。
解法
先用rand7构造一个大的数据范围,然后拒绝采样。为了调用rand7次数少,应该使得拒绝的范围尽可能少
func rand10() int {
ans := 0
for {
x := rand7()
y := rand7()
// 转换成7进制,ans的取值范围是0~48,为了减少调用rand7的次数,只要0~39
ans = (y-1)*7 + (x - 1)
if ans < 40 {
break
}
}
return ans%10 + 1
}