LeetCode--470. 用 Rand7() 实现 Rand10()

470. 用 Rand7() 实现 Rand10()

思路: 7 < 10
我们需要扩充Rand7(),让使用Rand7()组合成的RandX的范围大于Rand10()。
(此处RandX()范围均为[1-X])
如何扩充?
1 Rand7() + Rand7()。
产生的结果是在1-14正太分布,不符合
2 Rand7() * Rand7()
产生的结果是在1-49正太分布,不符合
3 (rand7()-1) × 7 + rand7()
可以等概率的生成1-49的数字

已知 rand_N() 可以等概率的生成[1, N]范围的随机数 那么: (rand_X() - 1) × Y + rand_Y() ==>
可以等概率的生成[1, X * Y]范围的随机数 即实现了 rand_XY()
在这里插入图片描述
采用拒绝采样,只选取1-40,并将其平均分成10分,如果产生的结果不在1-40中,则重新采样
时间复杂度:期望时间复杂度为 O(1),但最坏情况下会达到 O(∞)(一直被拒绝)。
空间复杂度:O(1)。

import java.util.Random;

/**
 * 470. 用 Rand7() 实现 Rand10()
 *
 */

public class Solution470 {

  private Random random = new Random();

  public int rand10() {
    int res = rand49();
     while (res > 40) {
       res = rand49();
     }
     return (res - 1) % 10 + 1;
  }

  private int rand49() {
    return rand7() + (rand7() - 1) * 7;
  }

  private int rand7() {
    return random.nextInt(7) + 1;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值