zoukankan      html  css  js  c++  java
  • 用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...

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

  • 相关阅读:
    weakself的另一种写法
    SDWebImage的使用说明
    关于AVPlayerItem对象的属性duration返回播放总时长的坑
    Xcode 问题
    循环引用问题
    使用Spring Animation的API创建动画
    iOS触摸事件处理
    OS开发中的事件处理(二)-事件传递,响应者链条
    python实现简单的百度云自动下载
    我眼中的K-近邻算法
  • 原文地址:https://www.cnblogs.com/MrWho/p/python-short-random-something.html
Copyright © 2011-2022 走看看