Leetcode 470. 用 Rand7() 实现 Rand10()

题目

在这里插入图片描述
Leetcode 470. 用 Rand7() 实现 Rand10()

代码(首刷看解析)

// ①已知 rand7()可以等概率生成1~7;
        // ②那么rand7()-1可以等概率生成0~6;
        // ③那么(rand7()-1)* 7 可以等概率生成{0, 7, 14, 21, 28, 35, 42};
        // ④那么(rand7()-1)* 7 + rand7()可以等概率生成1~49。

        // 现在我们实现了等概率生成1~49的功能,我们规定如果生成的数大于40,
        // 我们就重新生成,即只要生成在1~40之间的数,这一我们就可以生成1~40的等概率分布。

        // 再接着,我们用(1~40)%10,就可以得到0~9
        // 最后,(1~40)%10 + 1 ,就可以得到1~10了。
class Solution {
public:
    int rand10() {
        int ans = 0;
        do {
            ans = (rand7() - 1) * 7 + rand7();
        } while(ans > 40);
        return 1 + ans % 10;
    }
};

代码(8.28 二刷看解析)

(rand7()-1)* 7 + rand7()可以等概率生成1~49。

func rand10() int {
    ans := (rand7()-1)*7 + rand7()
    for ans > 40 {
        ans = (rand7()-1)*7 + rand7()
    }
    return ans % 10 + 1
}

代码(9.3 三刷自解)

class Solution {
public:
    int rand10() {
        int num = 0;
        do {
            num = (rand7()-1)*7+rand7();
        } while(num > 40);
        return (num%10)+1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值