Python程序员面试算法宝典---解题总结: 第6章 基本数字运算 6.5 如何根据已知随机数生成函数计算新的随机数

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第6章 基本数字运算 6.5 如何根据已知随机数生成函数计算新的随机数

题目:
已知随机数生成函数rand7()能产生的随机数是整数1~7,的均匀分布,如何构造rand10()
函数,使其产生的随机数是整数1~10的均匀分布

分析:
之前做过,有点忘记了。


关键:
1 书上解法
rand7()产生                       {1,2,...,7}
rand7()-1产生                     {0,1,...,6}
[rand7()-1]*rand7()               {0,7,...,14}
[rand7()-1]*rand7() + rand7()     构造出均匀分布在1~49
                                    对41~49截断
                                    随机数x % 10 + 1 即可得到1~10
2 没有想到
是因为忘记构造出
rand7() - 1得到0~6
用(rand7() - 1) * rand7() 构造出1,7,。。,42
用(rand7() - 1) * rand7() + rand7() 构造出均匀分布在1~49
用x % 10 + 1得到属于1~10

3
uniform() 方法将随机生成下一个实数,它在 [x, y] 范围内
https://www.runoob.com/python/func-number-uniform.html
参考:
Python程序员面试算法宝典
'''
import random

def rand7():
    return int(random.uniform(1, 7))

def rand10():
    a = 0
    while True:
        a = (rand7() - 1) * rand7() + rand7()
        if a <= 40:
            break
    result = a % 10 + 1
    return result


def process():
    for i in range(0, 100):
        print rand10()


if __name__ == "__main__":
    process()

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值