470. 用 Rand7() 实现 Rand10()

121 阅读1分钟

题目:
给定方法 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
}