Re: [請益] 怎麼保証不會產生重覆的亂數

看板PHP作者 (!!M)時間15年前 (2010/05/13 12:31), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串5/5 (看更多)
※ 引述《knives ()》之銘言: : 如果我要產生一萬筆(可能更多 ) : 而裡面的資料是由 : 一個陣列像這樣 : $my_array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', : 'n', 'p', '2', '3', '4', '5','6','7','8','9'); : 利用array_rand的方式 亂數抓10個出來 這裡小小提醒一下, array_rand 不會產生重複字母的字串 例: 'abacda', 所以你能產生的亂數會比較少, 但即使這樣, 以上的 $my_array 組合應該也夠用 離題了 ... : 再把它組合成一個字串,再把字串寫入到資料庫去 : 之前,我是在寫入到資料庫的時候,又做一次select count 的sql 查詢 : 可是發現這樣子,整個網頁很容易當(還沒到php 的timeout時間就掛了) : 拿掉之後,就比較不會當了 ^^^^^^^^^^ 所以是偶爾會當, 還是要找解決根本的辦法 : 但是我要怎麼確保這些字串絕對不會重覆到,如果不做查詢的話 不做查詢的話, 是一定會重複的 如果假設程式跑了成千上萬次, 資料庫已有上億筆資料 (甚至兆) array_rand 產生出來的亂數很難不跟已有的資料重複 建議方案 (但不一定實用) 把所有 $my_array 的組合先塞入資料庫, 例: table: id_tracker id | is_used -------------------------- 'abcdefg' 0 'abcdefh' 0 要產生亂數時: SELECT id FROM id_tracker WHERE is_used = 0 ORDER BY rand() LIMIT 10000 應該在短時間內就可以完成 之後要再 UPDATE id_tracker SET is_used = 1 WHERE id IN (剛剛產生的亂數) 缺點: 一開始塞資料超費時, 筆數又多 優點: 可以每次快數產生亂數 不再 timeout -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.158.57.59
文章代碼(AID): #1Bwu2QZj (PHP)
文章代碼(AID): #1Bwu2QZj (PHP)