数字无处不在, 在一些应用场景就特别需要, 比如 订单号 / 防伪码 / 抽奖 / 用户编号 等.

订单号一般都是即时生成的, 比如很多都是用下单时间或者时间戳 如:2020043018010005 或者 1588240860000 还能再加上用户 ID 和随机数, 所以就没什么难度.

但是有些应用场景就不一样了, 比如防伪码和用户编号, 防伪码可能有十万个或者更多, 就需要一次性批量的生成了, 并且还要保证唯一性, 另外因为防伪码的特殊性还需要保证无序. 如果用户编号想做到无序也是一样, 需要先批量生成存储到某个容器, 然后依次拿出使用.

查阅了一些资料, 想了解一下怎么样才能又快又能保证唯一性和无序的大量生成数字, 看到了 "雪花算法", 但是感觉有点难. 劝退了...

博主有简单学一下 Python , 所以就拿 Python 写一下(献丑了)import random

lst_number = []

lst_selected_number = []

start_number = 1000000 # 开始数字

end_number = 9999999 # 结束数字

num = 100000 # 生成数量

if end_number <= start_number:

print('结束数字不能小于开始数字')

exit()

for x in range(start_number, end_number):

lst_number.append(x)

lst_selected_number = random.sample(lst_number, num)

print(lst_selected_number)

将上面代码复制保存到 number.py 并运行. 会打印出一个装满了十万个数字的列表:

这样一下子就生成出来了十万个无序且唯一的数字.

逻辑很简单, 就是先设置一个空列表, 然后循环遍历开始数字到结束数字, 比如从 1000000 开始, 到 9999999 结束, 将每个遍历出来的数字装入列表, 那么这个列表的元素就有 1000001, 1000002 1000003 ... 直到 9999998. 遍历完成后列表就一共有九百万个数字, 使用 random.sample 函数就能直接从列表的九百万个数字中抽取十万个数字出来, 且是不重复的抽. 所以就拿到了十万个唯一且无序的数字.

拿到数字之后可以保存到一些容器按需使用, 但是仔细看上图, 每个数字的长度都是七位. 假如防伪码需要的是十一位呢, 可以修改代码的开始数字为 10000000000 到 99999999999 然后运行代码会发现, 没反应了... 再打开系统任务管理器, 发现 Python 占用的内存极高.

再过没多久, 就直接报错了.

内存不够了...

盲猜是因为遍历存入列表, 列表数据太多把内存撑爆了, 所以使用 Redis 的列表进行存储:import random

import redis

pool = redis.ConnectionPool(host = 'localhost', port = 6379, decode_responses = true)

container_box = redis.Redis(connection_pool = pool) # 连接池

start_number = 10000000000 # 开始数字

end_number = 99999999999 # 结束数字

if end_number <= start_number:

print('结束数字不能小于开始数字')

exit()

for x in range(start_number, end_number):

container_box.lpush("list1", x)

print(container_box.llen("list1"))

执行代码, Redis 会开始存储数字, 使用可视化工具看得很直观

但是问题来了, 按照之前代码(本文第一段代码)生成九百万个数字的效率, 时间应该是两秒, 第二段代码生成十一位的数字就是九百亿个, 假设一秒能完成九百万个数字, 那也要 10000 秒, 就是最快也要 3 个小时... 但实际肯定是不止的.

博主用了大概两个半小时才生成了七千万个数字就放弃了...

如果已经完成数字遍历并将数字存入了 Redis, 接下来要做的就是按需使用, 需要使用数字的时候, 从 0 到 90000000000 (九百亿) 取一个随机数字, 拿列表中这个随机数字(Key)的元素, 拿取之后记得删除该元素.

经过博主的测试, 生成十万个长度八位(10000000 - 99999999 之间)的数字(无序且唯一)需要用时 17 秒(不使用 Redis)左右.

九位及以上就爆内存了.. 运行代码的机器是 16G 的. 如果电脑有 32G 或许可以挑战一下11位.

python组成三位无重复数字_Python生成十万个无序且唯一的数字相关推荐

  1. python求三个数的最大值编程_python 判断三个数字中的最大值实例代码

    python 判断三个数字中的最大值,具体代码如下所示: #判断三个数中最大值 n1= int(input('please enter the firest number:')) n2 = int(i ...

  2. 用python输入三个整数输出最大值_python 判断三个数字中的最大值实例代码

    python 判断三个数字中的最大值,具体代码如下所示: #判断三个数中最大值 n1= int(input('please enter the firest number:')) n2 = int(i ...

  3. python创建数字列表_Python 生成一个从0到n个数字的列表4种方法小结

    Python 生成一个从0到n个数字的列表4种方法小结 我就废话不多说了,直接上代码吧! 第一种 def test1(): l = [] for i in range(1000): l = l + [ ...

  4. python生成数字_Python生成数字图片代码分享

    本文向大家分享了几段Python生成数字图片的代码,喜欢的朋友可以参考.具体如下: 最终版本 # -*- coding:utf-8 -*- from PIL import Image,ImageFon ...

  5. python求三位水仙花数

    三位水仙花数 1)"水仙花数"是指一个三位整数,其各位数字的3次方和等于该数本身.‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‪‫‪‪‪‪‪ ...

  6. Python 判断三位水仙花数

    # 判断水仙花数""" 介绍:水仙花数是一个三位数,它的每位数字的3次幂之和等于它本身.例如:153 == (1 ** 3) + (5 ** 3) + (3 ** 3)知 ...

  7. 数据库三范式 无重复列 完全依赖主键 属性不依赖非主属性

    参考:http://www.cnblogs.com/xrq730/p/5100442.html 细说数据库三范式 2.1 第一范式(1NF)无重复的列,保证每列的原子性,即每一列的各个属性值之间不能有 ...

  8. python列表去重并删除重复那个_Python实现去除列表中重复元素的方法总结【7种方法】...

    如何用python实现剔除列表中相同的元素 >>> a = [1, 2, 3, 1, 2, 3] >>> list(set(a)) [1, 2, 3] 先转成 se ...

  9. Python 打印三位所有水仙花数

    # 打印三位水仙花数""" 介绍:水仙花数是一个三位数,它的每位数字的3次幂之和等于它本身.例如:153 == (1 ** 3) + (5 ** 3) + (3 ** 3 ...

最新文章

  1. 通过button返回一个action,跳转到一个view
  2. linux 更改ctime_Linux 的文件系统及文件缓存知识点整理
  3. linux sed删除文件最后一行及shell中单引号、双引号的区别
  4. 手机版python3.6.6的requests库下载_Python爬虫之Python3.6 Requests库的基本使用方法
  5. php怎么实现简单的mvc框架,php实现简单的MVC框架实例
  6. PHP学习之路之在windows7 32位安装wampserver
  7. 操作系统核心原理-3.进程原理(上):进程概要
  8. 最全Spring常用注解详解
  9. CADD课程学习(13)-- 研究蛋白小分子动态相互作用-III(蛋白配体复合物 GROMACS)
  10. LeetCode热门100之 无重复字符的最长子串
  11. 日本語 IME输入法(Microsoft 输入法)切换问题
  12. 使用apicloud开发app
  13. 重学React基础知识整理——组件间的另类通信“插槽”(五)
  14. linux加密压缩文件gpg,linux文件--GPG 加密解密
  15. 除了霸王洗发水,还能怎么拯救程序员的发际线?
  16. linux 中copy软链接
  17. 智能手环设计与实现(一)--项目需求
  18. Android使用讯飞SDK开发语音识别及合成小Demo
  19. 谈谈我的单片机编程思路
  20. IP SLA及track技术的应用

热门文章

  1. WPF系列(一)第一个WPF应用程序!
  2. 【shell】常用语法 -b file -c file -f file-d file -x file
  3. 国际会议“First Helicon Plasma Physics and Applications Worckshop”口头报告PPT
  4. 通过History Trends Unlimited通过统计笔记本Edge浏览器Top10网页历史访问量(截止至2021.11.23)
  5. MATLAB粒子模拟代码注释
  6. 【学术软件】ETPS(English Text Processing Software)
  7. 3DSlicer8:FAQ-2
  8. Qt修炼手册10_QTableWidget控件使用说明及实践
  9. OpenGL编程指南1:OpenGL简介
  10. VTK修炼之道4_Win32控制台项目