470. Implement Rand10() Using Rand7()

public int rand10() {
        int a, idx;
        while (true) {
            a = rand7();

            idx = rand7() + (a - 1) * 7; // [1...49]

            if (idx <= 40) {
                return (idx - 1) % 10 + 1;
            }

            a = idx - 40;  // [1...9]

            idx = rand7() + (a - 1) * 7; // [1...63]

            if (idx <= 60) {
                return (idx - 1) % 10 + 1;
            }

            a = idx - 60;  // [1...3]

            idx = rand7() + (a - 1) * 7;    // [1...21]
            
            if (idx <= 20) {
                return (idx - 1) % 10 + 1;
            }
			// 这里idx值只能是21  直接跳过
        }
    }


rand7() 产生的数字范围是  [1, 2, 3, 4, 5, 6, 7]

rand7()-1   [0, 1, 2, 3, 4, 5, 6]

(rand7() - 1)*7 (必须是乘以7,乘以其它数字就不能保证 #产生所有数字且数字是等概率的#)    
(rand7() - 1)*7   产生的数字范围是  [0, 7, 14, 21, 28, 35, 42]

(rand7() - 1)*7 + rand7()  [1, ... 49] 

149是由 rand7()(rand7() - 1)*7  两两组合而成, 则产生 149之间的数字是等概率的

(rand7() - 1)*7 中 取 0 , 能和rand7() 组合成 [1, 2, 3, 4, 5, 6, 7]
(rand7() - 1)*7 中 取 7 , 能和rand7() 组合成 [8, 9, 10, 11, 12, 13, 14]
(rand7() - 1)*7 中 取 14 , 能和rand7() 组合成 [15, 16, 17, 18, 19, 20, 21]
(rand7() - 1)*7 中 取 21 , 能和rand7() 组合成 [...]
(rand7() - 1)*7 中 取 21 , 能和rand7() 组合成 [...]
(rand7() - 1)*7 中 取 35 , 能和rand7() 组合成 [...]
(rand7() - 1)*7 中 取 42 , 能和rand7() 组合成 [43, 44, 45, 46, 47, 48, 49]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值