力扣解题思路:随机采样问题 纠错记录

470. 用 Rand7 实现 Rand10

思路:在这里插入图片描述

这一题,我也没想出答案,看了评论这个答案才发现我有多菜(;´༎ຶД༎ຶ`)

枚举如下:
a	1	2	3	4	5	6	7
b								
1		2	3	4	5	6	7	8
2		3	4	5	6	7	8	9
3		4	5	6	7	8	9	0
4		5	6	7	8	9	0	1
5		6	7	8	9	0	1	2
6		7	8	9	0	1	2	3
7		8	9	0	1	2	3	4
去掉右上角的  
6	7	8
7	8	9
8	9	0      后

每个数字的出现次数为4次,0-9的概率相同

所以程序思路就很明了,当结果扫到右上角的时候进行递归调用,直到输出其他结果
a=rand7();  b=rand7();
if(a>4&&b<4)  return rand10();
else          return (a+b)%10+1;

根据分析写出代码:

class Solution extends SolBase {
   
    public int rand10() {
   
        int a=rand7(); 
        int b=rand7();
        if(a>4&&b<4)  
            return rand10();
        else          
            return (a+b)%10+1;
    }
}

我就有个疑问,怎么发现去掉右上角后,每个数字的出现次数为4次,0-9的概率相同这个规律的呢?(@_@; )也许这就是大佬吧~

还可以这样写,就可以推广到任意rand啦:

    public int rand10() {
   
        int res = 0;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值