力扣 470 :均匀的生成随机数

参考题解:

https://leetcode-cn.com/problems/implement-rand10-using-rand7/solution/cong-zui-ji-chu-de-jiang-qi-ru-he-zuo-dao-jun-yun-/

题目描述:

题目分析:

通过对 rand2() 来生成 rand4() 可以发现用 ( rand2() - 1 ) * 2  + rand2() 可以

所以可以得到规律 :

已知 rand_N() 可以等概率的生成[1, N]范围的随机数
那么:
(rand_X() - 1) × Y + rand_Y() ==> 可以等概率的生成[1, X * Y]范围的随机数
即实现了 rand_XY()

那么 rand7() 可以生成 1-7 的随机数

现在 用 rand7() 就可以生成 1-49 的随机数

又因为要生成 1- 10 的随机数,所以需要舍弃41 - 49 这9个数字,然后 % 10 + 1即可

 

优化

我们舍弃了 9 个数,能否舍弃的更少呢,因为这 9 个数是等概率出现的,所以 相当于有了 rand9()

那么通过 rand9() 和 rand7() 就又可以生成 rand63() 这时 只需要 舍弃 3 个数就行了

然后rand3() 和 rand7 又可以更进一步的生成 rand21() 这样就只需要舍弃一个就好了,更进一步的优化了时间复杂度

 

代码和结果:

// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7

class Solution {
public:
    int rand10() {
        int curr;
        while (true)
        {
            curr = (rand7() -1 )*7 + rand7();// rand49();
            if(curr <= 40) break;
            int t = curr%10;// rand9();
            curr = (rand7() - 1) * 7 + t;// rand63();
            if(curr <= 60) break;
            t = curr%10;// rand3()
            curr = (rand7() - 1) * 7 + t;// rand21();
            if(curr <= 20) break;
        }
        return 1 + curr % 10;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值