编程珠玑学习笔记一 python实现
最近打算研究一下《编程珠玑》这本神器,第一章主要讲了利用位图这种结构来方便地解决一些问题。
在看用位图排序的算法时,有几个小问题总结一下:
1.如何生成位于0到n-1之间的k个不同的随机顺序的随机整数
要求生成的k个随机数不重复,且每个随机数是小于n的。
这个问题当n,k值比较小时,比较容易解决,但当n值比较大时,比如10000000,不得不考虑算法的效率。
现给出两种解法(Python实现):
''' Created on 2012-7-31 @author: wanglei ''' import random def rand1(n,k): numlist=[i for i in range(0,n)] #print numlist klist=[0]*k for i in range(0,k): j=random.randint(i,n-1) tmp=numlist[j] numlist[j]=numlist[i] numlist[i]=tmp klist[i]=numlist[i] return klist #print numlist def rand2(n,k): boollist=[False]*n klist=[0]*k for i in range(0,k): j=-1 j=random.randint(0,n-1) while(boollist[j]): j=random.randint(0,n-1) klist[i]=j boollist[j]=True return klist n=10000000 k=5000000 print rand1(n,k) print rand2(n,k)
rand1(n,k)思路是将0-n-1的数先全部存入一个列表中,变量i从0循环至k-1,接着在(i,n-1)中产生随机数j,每次交换numlist[i]与numlist[j]的值,最后numlist列表中的前k个数(也就是klist)即为所要求的无重复随机数
rand2(n,k)思路是定义一个布尔值的数组,长度为n。初始化为False。接下来产生一个随机数j,循环直到boollist[j]为False时,将j值计入klist中