编程珠玑学习笔记一 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中

posted on 2012-07-31 11:29  温柔的暴力  阅读(786)  评论(3编辑  收藏  举报

导航