日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2025/3/15 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python组成三位无重复数字_Python生成十万个无序且唯一的数字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)字無處不在, 在一些應(yīng)用場景就特別需要, 比如 訂單號 / 防偽碼 / 抽獎 / 用戶編號 等.

訂單號一般都是即時生成的, 比如很多都是用下單時間或者時間戳 如:2020043018010005 或者 1588240860000 還能再加上用戶 ID 和隨機數(shù), 所以就沒什么難度.

但是有些應(yīng)用場景就不一樣了, 比如防偽碼和用戶編號, 防偽碼可能有十萬個或者更多, 就需要一次性批量的生成了, 并且還要保證唯一性, 另外因為防偽碼的特殊性還需要保證無序. 如果用戶編號想做到無序也是一樣, 需要先批量生成存儲到某個容器, 然后依次拿出使用.

查閱了一些資料, 想了解一下怎么樣才能又快又能保證唯一性和無序的大量生成數(shù)字, 看到了 "雪花算法", 但是感覺有點難. 勸退了...

博主有簡單學(xué)一下 Python , 所以就拿 Python 寫一下(獻(xiàn)丑了)import random

lst_number = []

lst_selected_number = []

start_number = 1000000 # 開始數(shù)字

end_number = 9999999 # 結(jié)束數(shù)字

num = 100000 # 生成數(shù)量

if end_number <= start_number:

print('結(jié)束數(shù)字不能小于開始數(shù)字')

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)

將上面代碼復(fù)制保存到 number.py 并運行. 會打印出一個裝滿了十萬個數(shù)字的列表:

這樣一下子就生成出來了十萬個無序且唯一的數(shù)字.

邏輯很簡單, 就是先設(shè)置一個空列表, 然后循環(huán)遍歷開始數(shù)字到結(jié)束數(shù)字, 比如從 1000000 開始, 到 9999999 結(jié)束, 將每個遍歷出來的數(shù)字裝入列表, 那么這個列表的元素就有 1000001, 1000002 1000003 ... 直到 9999998. 遍歷完成后列表就一共有九百萬個數(shù)字, 使用 random.sample 函數(shù)就能直接從列表的九百萬個數(shù)字中抽取十萬個數(shù)字出來, 且是不重復(fù)的抽. 所以就拿到了十萬個唯一且無序的數(shù)字.

拿到數(shù)字之后可以保存到一些容器按需使用, 但是仔細(xì)看上圖, 每個數(shù)字的長度都是七位. 假如防偽碼需要的是十一位呢, 可以修改代碼的開始數(shù)字為 10000000000 到 99999999999 然后運行代碼會發(fā)現(xiàn), 沒反應(yīng)了... 再打開系統(tǒng)任務(wù)管理器, 發(fā)現(xiàn) Python 占用的內(nèi)存極高.

再過沒多久, 就直接報錯了.

內(nèi)存不夠了...

盲猜是因為遍歷存入列表, 列表數(shù)據(jù)太多把內(nèi)存撐爆了, 所以使用 Redis 的列表進(jìn)行存儲:import random

import redis

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

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

start_number = 10000000000 # 開始數(shù)字

end_number = 99999999999 # 結(jié)束數(shù)字

if end_number <= start_number:

print('結(jié)束數(shù)字不能小于開始數(shù)字')

exit()

for x in range(start_number, end_number):

container_box.lpush("list1", x)

print(container_box.llen("list1"))

執(zhí)行代碼, Redis 會開始存儲數(shù)字, 使用可視化工具看得很直觀

但是問題來了, 按照之前代碼(本文第一段代碼)生成九百萬個數(shù)字的效率, 時間應(yīng)該是兩秒, 第二段代碼生成十一位的數(shù)字就是九百億個, 假設(shè)一秒能完成九百萬個數(shù)字, 那也要 10000 秒, 就是最快也要 3 個小時... 但實際肯定是不止的.

博主用了大概兩個半小時才生成了七千萬個數(shù)字就放棄了...

如果已經(jīng)完成數(shù)字遍歷并將數(shù)字存入了 Redis, 接下來要做的就是按需使用, 需要使用數(shù)字的時候, 從 0 到 90000000000 (九百億) 取一個隨機數(shù)字, 拿列表中這個隨機數(shù)字(Key)的元素, 拿取之后記得刪除該元素.

經(jīng)過博主的測試, 生成十萬個長度八位(10000000 - 99999999 之間)的數(shù)字(無序且唯一)需要用時 17 秒(不使用 Redis)左右.

九位及以上就爆內(nèi)存了.. 運行代碼的機器是 16G 的. 如果電腦有 32G 或許可以挑戰(zhàn)一下11位.

總結(jié)

以上是生活随笔為你收集整理的python组成三位无重复数字_Python生成十万个无序且唯一的数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。