rand7实现rand10

该博客介绍了如何利用已有的rand7方法生成1到7的随机数,通过数学技巧扩展为生成1到10的随机整数。详细探讨了通过(rand7()-1)*7+rand7()生成[1,49]随机数,然后通过拒绝采样法获取[1,10]范围内的随机数。这种方法保证了生成的随机数在指定范围内分布均匀。
摘要由CSDN通过智能技术生成

已有方法rand7可生成1到7范围内的均匀随机数,试写一个方法rand10生成1到10范围内的均匀随机整数。

假设randN()能等概率的生成[1, N]范围内的所记述,则(randX() - 1)*Y + randY()能等概率地生成[1, X*Y]范围内的随即数。例如,假设rand2能生成[1,2]范围内地随机数,rand3能生成[1,3]范围内的随机数,则(rand2() - 1) * 3 + rand3()能生成[1,6]范围的随机数。

  • 通过(rand7() - 1) * 7 + rand7()生成[1,49]的随机数
  • 如果能生成[1, 50]之间的随机数num,则我们使用num % 10 + 1就可以生成[1,10]之间的随机数,也就是rand10(),但只能生成[1,49]的随机数,这种情况下可以使用拒绝采用,也就是某个数字不符合条件就丢弃它,在这个问题中只有num[1,40]之间时,我们才生成num % 10 + 1作为[1, 10]之间的随机数。如果num不在[1,40]之间,就继续生成num,直到[1,40]之间。
class Solution{
public:
    int rand10()
    {
        while(true)
        {
            int num = (rand7() - 1) * 7 + rand7();
            if(num <= 40)
                return num % 10 + 1;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值