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

你可能感兴趣的:(python)