鍍金池/ 問答/HTML5  PHP  數(shù)據(jù)庫/ 按照指定規(guī)則生成隨機(jī)數(shù)算法問題

按照指定規(guī)則生成隨機(jī)數(shù)算法問題

場(chǎng)景

每次需要生成n個(gè)1~s之間的隨機(jī)整數(shù),并存入數(shù)據(jù)庫,生成的隨機(jī)數(shù)不能與數(shù)據(jù)庫已有的數(shù)據(jù)重復(fù)

嘗試過的思路

  1. 在代碼中使用range生成含有1~s的集合,取出數(shù)據(jù)庫中已有數(shù)據(jù)計(jì)算差集,對(duì)差集結(jié)果數(shù)組隨機(jī)獲取元素。
  2. 隨機(jī)生成一個(gè)1~s的整數(shù),并查詢是否已存在于數(shù)據(jù)庫中,如果已存在則重新生成隨機(jī)數(shù),直到成功取出需要的全部數(shù)據(jù)。

問題

由于數(shù)據(jù)量達(dá)百萬級(jí)別,并且操作執(zhí)行頻率高,思路1的方法消耗性能資源太大,思路2又由于執(zhí)行時(shí)間不可期,更不可取。
對(duì)于這種需求,是否有更合理的處理方式?

回答
編輯回答
空白格

寫一個(gè)我的思路,采用減法
我覺得你的s應(yīng)該是一個(gè)固定的數(shù)吧,既然這樣那么能出現(xiàn)的所有數(shù)據(jù)也已經(jīng)固定下來了
比如s=1000000,那么1~1000000里的隨機(jī)整數(shù)的全部可能也固定下來了
那么現(xiàn)在數(shù)據(jù)庫里創(chuàng)1000000條數(shù)據(jù),然后用戶來拿一個(gè)數(shù)了,就全部取出來,然后隨機(jī)一個(gè)整數(shù)出來,把這個(gè)數(shù)返給用戶的同時(shí)給這個(gè)數(shù)在數(shù)據(jù)庫里設(shè)置一個(gè)字段,比如used:true
下次用戶來取的時(shí)候再從數(shù)據(jù)庫里取全部數(shù),不過要帶上篩選條件,used不為true的,把取出的集合再隨機(jī)一個(gè)數(shù)出來分配給用戶,再把隨機(jī)出來的數(shù)在數(shù)據(jù)庫里設(shè)置一個(gè)相同字段,比如used:true
以此類推
這樣應(yīng)該不會(huì)存在重復(fù)的問題,開銷的話也只是查一次數(shù)據(jù)庫而已,比你的1,2應(yīng)該都快
當(dāng)然這個(gè)還有優(yōu)化的空間,比如這個(gè)所有的數(shù)據(jù)也不一定存在數(shù)據(jù)庫里啊,redis應(yīng)該也更快,等等。我只是說下我的思路

2018年5月5日 20:43
編輯回答
乖乖瀦

時(shí)間加隨機(jī)數(shù)
https://www.zhihu.com/questio...

2017年1月16日 16:01