编程笔记-rand7()生成rand10()

概述

 

已知随机数生成函数rand7()可以生成整数1-7之间的均匀分布,如何使用rand7()构造rand10(),使rand10()可以生成整数1-10的均匀分布

分析

要保证rand10()生成的随机数是1-10的均匀分布,可以先产生1-10*n的均匀分布,假设x是1-10*n区间上的一个随机数,那么x%10+1就是均匀分布在1-10区间上的整数,下面就用rand7()去生成1-10*n的均匀分布

步骤

A事件:rand7()产生{1,2,3,4,5,6,7}的离散集合中的一个,所以rand7()-1产生{0,1,2,3,4,5,6},每个数字的产生的概率为1/7

B事件:(rand7()-1)*7产生{0,7,14,21,28,35,42},其中每个数字产生的概率为1/7

A,B事件相互独立:所以(rand7()-1)*7+rand7()生成1-49之间的随机数,且概率均为1/7 * 1/7 = 1/49,即均匀分布

截取10的整数倍数:1-49是均匀分布的,所以1-40也是均匀分布的,所以截取1-40之间的数,执行x%10+1即可满足要求

编程

#由rand7生成rand10
import random
#产生随机数是1-7的均匀分布
def rand7():
	return int(random.uniform(1,7))
#产生随机数1-10的均匀分布
def rand10():
	x = 0
	while True:
		x = (rand7()-1)*7 + rand7()
		if x <= 40:
			break
	return x % 10 + 1

这里通过random库的随机生成函数生成1-7的均匀分布,然后根据上述思路扩展到1-10,break那里负责在获得的数字满足要求(即数字在1-40之间)跳出while循环,否则执行到满足要求为止。这里截取1-10,1-20,1-30再取余加一也是可以的,之所以取1-40,就是为了节省平均时间开销,因为取40可以平均最快跳出循环,减少时间开销。

验证

根据大数定律,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率,我们随机试验次数n取100000次

#初始化
n = 100000
num_all = dict()
for i in range(1,11):
	num_all.setdefault(i,0)
num = 0
while num < n:
	num_all[rand10()] += 1
	num += 1
for i in num_all:
	print(i,'出现概率',float(num_all[i])/n)

运行结果

1 出现概率 0.11563
2 出现概率 0.08515
3 出现概率 0.11369
4 出现概率 0.11441
5 出现概率 0.08713
6 出现概率 0.08642
7 出现概率 0.11435
8 出现概率 0.08457
9 出现概率 0.08435
10 出现概率 0.1143

                         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIT_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值