Java隨機(jī)數(shù)算法原理與實(shí)現(xiàn)方法實(shí)例詳解
本文實(shí)例講述了Java隨機(jī)數(shù)算法。分享給大家供大家參考,具體如下:
軟件實(shí)現(xiàn)的算法都是偽隨機(jī)算法,隨機(jī)種子一般是系統(tǒng)時(shí)間
在數(shù)論中,線性同余方程是最基本的同余方程,“線性”表示方程的未知數(shù)次數(shù)是一次,即形如:
ax≡b (mod n)
的方程。此方程有解當(dāng)且僅當(dāng) b 能夠被 a 與 n 的最大公約數(shù)整除(記作 gcd(a,n) | b
)。這時(shí),如果 x0 是方程的一個(gè)解,那么所有的解可以表示為:
{x0+kn/d|(k∈z)}
其中 d 是a 與 n 的最大公約數(shù)。在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 個(gè)解。
例子編輯
* 在方程 3x ≡ 2 (mod 6)
中, d = gcd(3,6) = 3
,3 不整除 2,因此方程無解。
* 在方程 5x ≡ 2 (mod 6)
中, d = gcd(5,6) = 1
,1 整除 2,因此方程在{0,1,2,3,4,5} 中恰有一個(gè)解: x=4。
* 在方程 4x ≡ 2 (mod 6)
中, d = gcd(4,6) = 2
,2 整除 2,因此方程在{0,1,2,3,4,5} 中恰有兩個(gè)解: x=2 and x=5。
純線性同余隨機(jī)數(shù)生成器
線性同余隨機(jī)數(shù)生成器介紹:
古老的LCG(linear congruential generator)代表了最好最樸素的偽隨機(jī)數(shù)產(chǎn)生器算法。主要原因是容易理解,容易實(shí)現(xiàn),而且速度快。
LCG 算法數(shù)學(xué)上基于公式:
X(0)=seed;
X(n+1) = (A * X(n) + C) % M;
其中,各系數(shù)為:
X(0)表示種子seed
模M, M > 0
系數(shù)A, 0 < A < M
增量C, 0 <= C < M
原始值(種子) 0 <= X(0) < M
其中參數(shù)c, m, a比較敏感,或者說直接影響了偽隨機(jī)數(shù)產(chǎn)生的質(zhì)量。
一般來說我們采用M=(2^31)-1 = 2147483647,這個(gè)是一個(gè)31位的質(zhì)數(shù),A=48271,這個(gè)A能使M得到一個(gè)完全周期,這里C為奇數(shù),同時(shí)如果數(shù)據(jù)選擇不好的話,很有可能得到周期很短的隨機(jī)數(shù),例如,如果我們?nèi)eed=179424105的話,那么隨機(jī)數(shù)的周期為1,也就失去了隨機(jī)的意義。
(48271*179424105+1)mod(2的31次方-1)=179424105
package test; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; public class Random { public final AtomicLong seed=new AtomicLong(); public final static long C = 1; public final static long A = 48271; public final static long M = (1L << 31) - 1; public Random(int seed){ this.seed.set(seed); } public Random(){ this.seed.set(System.nanoTime()); } public long nextLong(){ seed.set(System.nanoTime()); return (A *seed.longValue() + C) % M; } public int nextInt(int number){ return new Long( (A * System.nanoTime() + C) % number).intValue(); } public static void main(String[] args) { System.out.println(new Random().nextLong()); Map<Integer,Integer> map=new HashMap<Integer,Integer>(); for(int i=0;i<100000;i++){ int ran=new Random().nextInt(10); if(map.containsKey(ran)){ map.put(ran, map.get(ran)+1); }else{ map.put(ran, 1); } } System.out.println(map); } }
自己寫個(gè)簡單例子,隨機(jī)10萬次,隨機(jī)范圍0到9,看看是否均勻
相對(duì)來說還是挺均勻的
PS:這里再為大家提供幾款功能類似的在線工具供大家參考:
在線隨機(jī)數(shù)字/字符串生成工具:
http://tools.jb51.net/aideddesign/suijishu
在線隨機(jī)字符/隨機(jī)密碼生成工具:
http://tools.jb51.net/aideddesign/rnd_password
高強(qiáng)度密碼生成器:
http://tools.jb51.net/password/CreateStrongPassword
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
使用JavaBean根據(jù)指定條件設(shè)置屬性值默認(rèn)值方式
這篇文章主要介紹了使用JavaBean根據(jù)指定條件設(shè)置屬性值默認(rèn)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Mybatis游標(biāo)查詢大量數(shù)據(jù)方式
這篇文章主要介紹了Mybatis游標(biāo)查詢大量數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02詳解微信開發(fā)之Author網(wǎng)頁授權(quán)
微信開發(fā)中,經(jīng)常有這樣的需求:獲得用戶頭像、綁定微信號(hào)給用戶發(fā)信息,那么實(shí)現(xiàn)這些的前提就是授權(quán)!本文對(duì)此進(jìn)行系統(tǒng)介紹,需要的朋友一起來看下吧2016-12-12Mybatis中resultMap的Colum和property屬性詳解
這篇文章主要介紹了Mybatis中resultMap的Colum和property屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01mybatis collection關(guān)聯(lián)查詢多個(gè)參數(shù)方式
在使用MyBatis進(jìn)行關(guān)聯(lián)查詢時(shí),往往需要根據(jù)多個(gè)參數(shù)進(jìn)行查詢,例如,使用evtId和businessType作為查詢條件,同時(shí)在resultMap中配置id和businessType1作為結(jié)果映射,這種情況下,可以通過<sql>標(biāo)簽定義參數(shù)模板,或者使用@Param注解指定參數(shù)名稱2024-10-10