编程珠玑学习笔记一 python实现

本文探讨了在编程中使用位图结构生成位于0到n-1之间的k个不同随机顺序的随机整数的方法,提供了两种实现方式:rand1和rand2。其中,rand1方法通过创建包含0到n-1的数的列表,然后通过随机交换元素的位置来生成所需随机数;rand2方法则利用布尔列表来避免重复选择。这两种方法在处理大量数据时展现出高效的性能。

最近打算研究一下《编程珠玑》这本神器,第一章主要讲了利用位图这种结构来方便地解决一些问题。

在看用位图排序的算法时,有几个小问题总结一下:

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中

转载于:https://www.cnblogs.com/hello--the-world/archive/2012/07/31/2616546.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值