# -*- 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()