- 470. 用 Rand7() 实现 Rand10() 微信常考,还有二叉树的倒数第k个节点">470. 用 Rand7() 实现 Rand10() 微信常考,还有二叉树的倒数第k个节点
470. 用 Rand7() 实现 Rand10() 微信常考,还有二叉树的倒数第k个节点
已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random() 方法。
输入: 3 输出: [8,1,10]
文章基于这样一个事实: (randX() - 1)Y + randY() 可以等概率的生成[1, X Y]范围的随机数
//多次生成减少抛弃的数量
func rand10() int {
for {
ans := (rand7()-1)*7 + rand7()
if ans <= 40 { //生成范围1-49,取1-40
return 1+ans%10
}
ans = (ans-40-1)*7+rand7() //大于40的9个数再次生成随机数
if ans <= 60 { //生成范围1-63,取1-60
return 1+ans%10
}
ans = (ans-60-1)*7+rand7() //大于60的3个数再次生成随机数
if ans <= 20 { //生成范围1-21,取1-20
return 1+ans%10
}
}
}