万能公式解决leetcode470题——Rand7() 实现 Rand10()

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

给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。

重点:古典概型;
参考:leetcode 470
答案:

1. 第一次rand7限定[1,6],判断奇偶性,概率是1/2
2. 第二次rand7限定[1,5],概率是1/5
3. 二者结合可以得出10种概率相同的结果
*/
class Solution extends SolBase {
    public int rand10() {
        int first, second;
        while ((first = rand7()) > 6);
        while ((second = rand7()) > 5);
        return (first&1) == 1 ? second : 5+second;
    }
}

拓展

在这里插入图片描述

这个题目的的第二小题答案:

int rand100() {
        int first, second,third;
        while ((first = rand7()) >4);
        while ((second = rand7()) > 5);
       while ((third = rand7()) > 5);
        return (first-1)*25+(second-1)*5+third;
    }

关于如何生成映射函数的探究:

文章基于这样一个事实 (randX() - 1)*Y + randY() 可以等概率的生成[1, X * Y]范围的随机数

应该是这样(randx() - 1) * Y的范围是【0, x-1, (x-1)*2, … , (x-1)Y】这么一个集合,加上randY()就相当于给这个集合中每一个元素及其后面加上并填充了【1…Y]之间的这些数,最后的范围才是【1,2,…,XY】。

我们来分析一下第二小题的代码,有人可能会问这里有三个部分,不符合“ (randX() - 1)*Y + randY() “的特性。但是不然,我们把(second-1)*5+third看成一个整体Y,X = (first-1),只要Y能等概率生成1 - 25范围内的数字,那么总体上看符合(randX() - 1)*Y + randY() 定律,再细看Y = (second-1)*5+third也是能等概率生成0-25范围内的数,因为third = rand5()。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值