2021-09-05 LeetCode470(每日一题)

算法思路借鉴于官方题解,添加了详细注释用于理解,刷题打卡
拒绝采样法(无优化)-存在最坏情况时间复杂度O(∞)(一直被拒绝)

class Solution
{
public:
    int rand10()
    { //拒绝采样思路,目的就是构造等概率有规律的40个数字
        while (1)
        {
            int a = rand7(), b = rand7(), res;
            res = (a - 1) * 7 + b; //产生1-49范围内等概率所有整数
            if (res <= 40)
                return (res) % 10 + 1; //res处于1-40范围内时可用,处于41-49时拒绝使用,重新取样
        }
    }
};

拒绝采样法(添加优化)-大概率避免了一直被拒绝的情况(实际上存在一直取到最后一种情况的21,但概率极低)

class Solution
{
public:
    int rand10()
    {
        /*拒绝采样法的优化,思路为将拒绝的数字利用起来重新产生连续递增的整数,取其中10的最大整数倍个数字作为有效数字
        无效数字继续用于产生连续递增的整数,若最后只剩1则无法达到生成数据的目的,需重新开始整个循环*/
        while (1)
        {
            int a = rand7(), b = rand7(), res;
            res = (a - 1) * 7 + b;
            if (res <= 40)
                return (res) % 10 + 1;
            res = (res - 40 - 1) * 7 + rand7(); //利用41-49生成1-63,取1-60有效
            if (res <= 60)
                return (res) % 10 + 1;
            res = (res - 60 - 1) * 7 + rand7(); //利用61-63生成1-21,取1-20有效
            if (res <= 20)
                return (res) % 10 + 1;
            //仅剩21时无法继续生成,重新进入循环
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值