等概率生成随机数

题目一:已知有一个rand3()函数,可以生成等概率的[1, 3]范围内的随机整数,利用这个rand3()函数构造一个rand7()函数,生成等概率[1, 7]范围内的随机整数。

 

分析:要保证rang7在整数1-7的均匀分布,可以构造一个1-7*n(n为任何正整数)的均匀分布的随机整数区间。假设x是这个1-7*n区间上的一个随机整数,那么x%7+1就是均匀分布在1-7上的整数。由于(rand3()-1)*3+rand3()可以构造出均与分布在1-9的随机数,可以将8和9剔除掉仍然是均匀分布在1-7的,因为每个数都是一个独立的事件。

为什么(rand3()-1)*3+rand3()可以构造出均匀分布在1-9的随机数?

    因为rand3()-1的得到的是一个离散整数集合{0,1,2},其中每个整数出现的概率是1/3。那么(rand3()-1)*3得到一个离散整数集合A={0,3,6},其中每个整数出现的概率也是1/3.而rand3()得到的集合B={1,2,3}中每个整数出现的概率也是1/3,集合A和B中任何两个元素相加可以与1-9之间的一个整数对应,也就是说1-9之间任何一个数,可以唯一确定A和B中两个元素相加的组合方式。由于A和B中的元素可以看成是独立事件,根据独立事件的概率公司P(AB)=P(A)P(B),得到每个组合的概率是1/3*1/3=1/9。因此(rand3()-1)*3+rand3()生成的整数均匀的分布在1-9之间,每个数的概率1/9。

def random7():
	x = 0
	while x <= 7:
		x = 3 * (random3() - 1) + random3()
	return x % 7 + 1

归纳:已知randm()生成随机数的范围是[1,m],求randn()生成[1,n]范围的函数,m

def randn(t:int):
    """
    t:t为n的最大倍数,且满足t

题目二:已知随机函数rand(),以p的概率生成0,以1-p的概率生成1,现在要求设计一个新的随机函数newRand(),使其以1/n的概率产生1-n之间的任意一个数。

思路:可以通过已知随机函数rand()产生等概率0和1新随机函数Rand(),然后调用k次(k为整数n的二进制表示位数)Rand()函数,得到一个长度为k的0和1的序列,以此序列所形成的整数即为1-n之间的数字。冲产生的序列中的到的整数可能大于n,如果大于n的话,则重新产生直至得到的整数不大于n。

1.由rand()函数产生Rand()函数,Rand()函数等概率产生0和1;

2.计算整数n的二进制表示所拥有的位数k,k=1+logn(以2为底)

3.调用k次Rand()产生随机数,产生K歌序列表示1-n之间的数。

 

你可能感兴趣的:(算法)