问答题 5.  随机地从大小为n的数组中选取m个整数,要求每个元素被选中的概率相等。
【正确答案】从n个数中随机选出一个数的概率为1/n,然后在剩下的n-1个数中再随机找出一个数的概率也为1/n(第一次没选中这个数的概率为(n-1)/n,第二次选中这个数的概率为1/(n-1),因此,随机选出第二个数的概率为((n-1)/n)*(1/(n-1))=1/n),依次类推,在剩下的k个数中随机选出一个元素的概率都为1/n。因此,这种方法的思路为:首先从有n个元素的数组中随机选出一个元素,然后把这个选中的数字与数组第一个元素交换,接着从数组后面的n-1个数字中随机选出1个数字与数组第二个元素交换,依次类推,直到选出m个数字为止,数组前m个数字就是随机选出来的m个数字,且它们被选中的概率相等。实现代码如下:
   import random
   def getRandomM(a,n,m):
   if a==None or n<=0 or n<m:
   print "参数不合理"
   return
   i=0
   while i<m:
   j=random.randint(i,n-1)#// 获取i到n-1间的随机数
   #随机选出的元素放到数组的前面
   tmp=a[i]
   a[i]=a[j]
   a[j]=tmp
   i+=1
   
   if __name__=="__main__":
   a=[1,2,3,4,5,6,7,8,9,10]
   n=10
   m=6
   getRandomM(a,n,m)
   i=0
   while i<m:
   print a[i],
   i+=1
   程序的运行结果为:
   1    8    9    7    2    4
   算法性能分析:
   这种方法的时间复杂度为O(m)。
【答案解析】

[考点] 如何等概率地从大小为n的数组中选取m个整数。