第一種做法:
f(k) = (k*F(N-1)) mod F(N)
其中,
k是一個(gè)序列號(hào), 就是要取的那個(gè)數(shù)的順序號(hào)
F(N)是這樣一個(gè)序列 F(0) = 0, F(1) = 1, F(N+2) = F(N+1)+F(N) (for N>=0)
第二種做法
V = ( ( V * 2 ) + B .xor. B ... )(Mod 2^n)
N+1 N 0 2
V是要取的隨機(jī)數(shù), B是個(gè)種子, n是隨機(jī)數(shù)的最大個(gè)數(shù)
原來這個(gè)問題, 很高難, 不少數(shù)學(xué)高手都為解決這個(gè)問題寫了論文, 咳咳, 偶真是個(gè)白癡
呵呵, 效果肯定是不錯(cuò)啦, 因?yàn)橛貌坏胶艽蟮谋?
至于應(yīng)用是這樣的, 比如, 你要給每個(gè)用戶在注冊(cè)的時(shí)候一個(gè)ID但有不希望用戶在看到自己的ID的時(shí)候能知道其他用戶的ID, 如果用SEQUENCE來生成ID的話, 一個(gè)用戶只要把自己的ID減1就能得到其它用戶的ID了. 所以要用隨機(jī)數(shù)來做ID, 這樣用戶很難猜到其他用戶的ID了.
當(dāng)然主要的問題是, 隨機(jī)數(shù)可能重復(fù). 因此希望使用一個(gè)隨機(jī)數(shù)做種子用它來確定一組"無規(guī)律"的自然數(shù)序列, 并且在這個(gè)序列中不會(huì)出現(xiàn)重復(fù)的自然數(shù). 在這里使用的方法生成的序列并不是沒有規(guī)律的, 只不過這個(gè)軌律很難被發(fā)現(xiàn)就是了.
Xn+1 = (aXn + b) mod c (其中, abc通常是質(zhì)數(shù))是一種被廣泛使用的最簡單的隨機(jī)數(shù)發(fā)生算法, 有研究表表明這個(gè)算法生成的隨機(jī)數(shù)基本上符合統(tǒng)計(jì)規(guī)律, JAVA, BORLAND C等用的都是這個(gè)方法, 一般只要保證第一個(gè)種子是真正的隨機(jī)數(shù)就行了,
下面來說一下重復(fù)的問題,
上述方法會(huì)有可能出現(xiàn)重復(fù), 因?yàn)楫?dāng)(aXn + b)有可能是同樣的數(shù)或者說余數(shù)相同的數(shù), 因此要想不重復(fù)就得變形
偶想到的方法是
Xn=(a*n + b) mod c n是一個(gè)在1到c之間的整數(shù), a*n + b就是一個(gè)線性公式了, 且若n不同則a*n + b也不同, 它們除上質(zhì)數(shù)c得到的余數(shù)也肯定不同, 因?yàn)?若不考慮a和b而只有n的時(shí)候, 每次的結(jié)果都是n,而線性公式, 只不過移動(dòng)了這條直線的位置和斜率而已, 每個(gè)結(jié)果仍然不會(huì)相同的,
為了增加不可預(yù)計(jì)性, 偶又為上面那個(gè)公式設(shè)計(jì)了, 隨機(jī)數(shù)種子, 于是就變成了這個(gè)樣子
F(N)=(隨機(jī)數(shù)*(N+隨機(jī)數(shù)))MOD 一個(gè)質(zhì)數(shù)
這樣就能夠產(chǎn)生 1到選定質(zhì)數(shù)之間的一個(gè)"無規(guī)律"的自然數(shù)序列了, 只要改變隨機(jī)數(shù)就能改變序列的次序
在應(yīng)用的時(shí)候, 要把隨機(jī)數(shù)種子和最后用到的序列號(hào)保存到一個(gè)表里, 每此使用的時(shí)候取出來算好, 再把序列號(hào)更新一下就可以了
具體地說, 就是可以建一個(gè)表來保存每個(gè)序列的隨機(jī)數(shù)種子, 然后再為這個(gè)序列建一個(gè)SEQUENCE就行了
然后就
SELECT MOD(序列控制表.隨機(jī)數(shù)*(SEQ.NEXTVAL+序列控制表.隨機(jī)數(shù))),序列控制表.質(zhì)數(shù))
FROM 序列控制表
WHERE 序列控制表.序列ID=XX
就OK了
注意 序列控制表.質(zhì)數(shù) 決定了序列的范圍
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號(hào)-2
違法及侵權(quán)請(qǐng)聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬商天勤律師事務(wù)所王興未律師提供法律服務(wù)