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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 随机数算法_Java随机数算法原理与实现方法实例详解

發布時間:2024/8/1 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 随机数算法_Java随机数算法原理与实现方法实例详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例講述了Java隨機數算法。分享給大家供大家參考,具體如下:

軟件實現的算法都是偽隨機算法,隨機種子一般是系統時間

在數論中,線性同余方程是最基本的同余方程,“線性”表示方程的未知數次數是一次,即形如:

ax≡b (mod n)的方程。此方程有解當且僅當 b 能夠被 a 與 n 的最大公約數整除(記作 gcd(a,n) | b)。這時,如果 x0 是方程的一個解,那么所有的解可以表示為:

{x0+kn/d|(k∈z)}

其中 d 是a 與 n 的最大公約數。在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 個解。

例子編輯

* 在方程 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} 中恰有一個解: x=4。

* 在方程 4x ≡ 2 (mod 6) 中, d = gcd(4,6) = 2,2 整除 2,因此方程在{0,1,2,3,4,5} 中恰有兩個解: x=2 and x=5。

純線性同余隨機數生成器

線性同余隨機數生成器介紹:

古老的LCG(linear congruential generator)代表了最好最樸素的偽隨機數產生器算法。主要原因是容易理解,容易實現,而且速度快。

LCG 算法數學上基于公式:

X(0)=seed;

X(n+1) = (A * X(n) + C) % M;

其中,各系數為:

X(0)表示種子seed

模M, M > 0

系數A, 0 < A < M

增量C, 0 <= C < M

原始值(種子) 0 <= X(0) < M

其中參數c, m, a比較敏感,或者說直接影響了偽隨機數產生的質量。

一般來說我們采用M=(2^31)-1 = 2147483647,這個是一個31位的質數,A=48271,這個A能使M得到一個完全周期,這里C為奇數,同時如果數據選擇不好的話,很有可能得到周期很短的隨機數,例如,如果我們去Seed=179424105的話,那么隨機數的周期為1,也就失去了隨機的意義。

(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 map=new HashMap();

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);

}

}

自己寫個簡單例子,隨機10萬次,隨機范圍0到9,看看是否均勻

相對來說還是挺均勻的

PS:這里再為大家提供幾款功能類似的在線工具供大家參考:

希望本文所述對大家java程序設計有所幫助。

總結

以上是生活随笔為你收集整理的java 随机数算法_Java随机数算法原理与实现方法实例详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。