document.write('
要保证rand10()产生的随机数是整数1~10的均匀分布,可以构造一个1~10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1~10*n区间上的一个随机数,那么x%10+1就是均匀分布在1~10区间上的整数。
 根据题意,rand7()函数返回1到7的随机数,那么rand7()-1则得到一个离散整数集合,该集合为{0,1,2,3,4,5,6},该集合中每个整数的出现概率都为1/7。那么(rand7()-1)*7得到另一个离散整数集合A,该集合元素为7的整数倍,即A={0,7,14,21,28,35,42},其中,每个整数的出现概率也都为1/7。而由于rand7()得到的集合B={1,2,3,4,5,6,7},其中每个整数出现的概率也为1/7。显然集合A与集合B中任何两个元素和组合可以与1~49之间的一个整数一一对应,即1~49之间的任何一个数,可以唯一地确定A和B中两个元素的一种组合方式,这个结论反过来也成立。由于集合A和集合B中元素可以看成是独立事件,根据独立事件的概率公式P(AB)=P(A)P(B),得到每个组合的概率是1/7*1/7=1/49。因此(rand7()-1)*7+rand7()生成的整数均匀分布在1~49之间,而且每个数的概率都是1/49。
 所以(rand7()-1)*7+rand7()可以构造出均匀分布在1~49的随机数,为了将49种组合映射为1到10之间的10种随机数,就需要进行截断了,即将41~49这样的随机数剔除掉,得到的数1~40仍然是均匀分布在1~40的,这是因为每个数都可以看成一个独立事件。由1~40区间上的一个随机数
x,可以得到x%10+1就是均匀分布在1~10区间上的整数。
 程序代码如下:
 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
 
 if __name__=="__main__":
 i=0
 while i!=10:
 print rand10(),
 i+=1
 程序的运行结果为:

 6 10 8 1 8 6 3 8 10 7 

');