用Python实现的一个简单的随机生成器

朋友在ctr工作,苦于各种排期神马的,让我帮他整一个xxxx管理系统
里面在用户管理上面需要有一个批量从文件导入的功能,我肯定不能用汉字来作唯一性约束,于是想到了随机生成.

我首先想到的是直接用itertools和random来'随机'产生一些,够用就OK了,想想其他的也不麻烦,类似微博等的短链生成工具用起来是很方便的,这是背景

割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割

网上搜索了一下相关的实现方法,看到了一个Java版的,这里用Python实现一下.

import uuid

def random_generator1(total=1, length=6):
    for i in range(total):
        base = list('abcdefghijklmbopqrstuvwxyzABCDEFGHIJKLMBOPQRSTUVWXYZ0123456789')
        seed = str(uuid.uuid4()).replace('-', '')
        lst = []
        for i in range(length):
            sub_str = seed[i*4:i*4+4]
            x = int(sub_str, 16)
            lst.append(base[x % 62])
        return ''.join(lst)

将上面的return换成yield,作为一生成器来用也是可以的,这样可以方便的往列表里面插入,

import uuid


def random_generator2(total=1, length=6):
    for i in range(total):
        base = list('abcdefghijklmbopqrstuvwxyzABCDEFGHIJKLMBOPQRSTUVWXYZ0123456789')
        seed = str(uuid.uuid4()).replace('-', '')
        lst = []
        for i in range(length):
            sub_str = seed[i*4:i*4+4]
            x = int(sub_str, 16)
            lst.append(base[x % 62])
        yield ''.join(lst)

本地随便测试了一下,

...

if __name__ == '__main__':
    lst = random_generator1(1000000)
    print len(set(lst))

    # out put 100000

据说Java实现的那位测试了下1000W条数据中也没有出现重复,看起来应该是够用了.

顺便说一下,这里uuid选取uuid4() 生成随机uuid作为种子,其他的几种不太理想,本地测试了一下时间戳方式的uuid1,10W条数据大概会有3W左右的重复,100W的时候重复了大概80W...

所以说,种子很重要啊..

posted @ 2015-04-15 01:03  Mx.Hu  阅读(2238)  评论(0编辑  收藏  举报