470. 用 Rand7() 实现 Rand10() 微信常考,还有二叉树的倒数第k个节点

已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
不要使用系统的 Math.random() 方法。
输入: 3 输出: [8,1,10]

文章基于这样一个事实: (randX() - 1)Y + randY() 可以等概率的生成[1, X Y]范围的随机数

  1. //多次生成减少抛弃的数量
  2. func rand10() int {
  3. for {
  4. ans := (rand7()-1)*7 + rand7()
  5. if ans <= 40 { //生成范围1-49,取1-40
  6. return 1+ans%10
  7. }
  8. ans = (ans-40-1)*7+rand7() //大于40的9个数再次生成随机数
  9. if ans <= 60 { //生成范围1-63,取1-60
  10. return 1+ans%10
  11. }
  12. ans = (ans-60-1)*7+rand7() //大于60的3个数再次生成随机数
  13. if ans <= 20 { //生成范围1-21,取1-20
  14. return 1+ans%10
  15. }
  16. }
  17. }

image.pngimage.png