java隨機數演算法
A. 如何在java中產生隨機數
在j2se里我們可以使用Math.random()方法來產生一個隨機數,這個產生的隨機數是0-1之間的一個double,我們可以把他乘以一定的數,比如說乘以100,他就是個100以內的隨機,這個在j2me中沒有。
在java.util這個包裡面提供了一個Random的類,我們可以新建一個Random的對象來產生隨機數,他可以產生隨機整數、隨機float、隨機double,隨機long,這個也是我們在j2me的程序里經常用的一個取隨機數的方法。
在我們的System類中有一個currentTimeMillis()方法,這個方法返回一個從1970年1月1號0點0分0秒到目前的一個毫秒數,返回類型是long,我們可以拿他作為一個隨機數,我們可以拿他對一些數取模,就可以把他限制在一個范圍之內。
B. java中 怎樣實現隨機4位的整數
可以藉助Math類里的random方法或者藉助Random類來實現
1、使用Math類的random方法實現產生1000-9999的隨機數代碼如下:
inta=(int)(Math.random()*(9999-1000+1))+1000;//產生1000-9999的隨機數
2、使用Random類實現代碼:
importjava.util.Random;//導入Random包
publicclassRanadd{
publicstaticvoidmain(String[]args){
intx;//定義兩變數
Randomne=newRandom();//實例化一個random的對象ne
x=ne.nextInt(9999-1000+1)+1000;//為變數賦隨機值1000-9999
System.out.println("產生的隨機數是:"+x);//輸出
}
}
說明:
1、Java中Math類中有random方法產生的隨機數是一個偽隨機選擇的(大致)均勻分布在從0.0到1.0這一范圍內的double類型數
2、java.util.Random類中實現的隨機演算法是偽隨機,也就是有規則的隨機,所謂有規則的就是在給定種(seed)的區間內隨機生成數字;相同種子數的Random對象,相同次數生成的隨機數字是完全相同的;Random類中各方法生成的隨機數字都是均勻分布的,也就是說區間內部的數字生成的幾率均等;
C. 淺談Java中的幾種隨機數
眾所周知,隨機數是任何一種編程語言最基本的特徵之一。而生成隨機數的基本方式也是相同的:產生一個0到1之間的隨機數。看似簡單,但有時我們也會忽略了一些有趣的功能。
我們從書本上學到什麼?
最明顯的,也是直觀的方式,在Java中生成隨機數只要簡單的調用:
java.lang.Math.random()
在所有其他語言中,生成隨機數就像是使用Math工具類,如abs, pow, floor, sqrt和其他數學函數。大多數人通過書籍、教程和課程來了解這個類。一個簡單的例子:從0.0到1.0之間可以生成一個雙精度浮點數。那麼通過上面的信息,開發人員要產生0.0和10.0之間的雙精度浮點數會這樣來寫:
Math.random() * 10
而產生0和10之間的整數,則會寫成:
Math.round(Math.random() * 10)
進階
通過閱讀Math.random()的源碼,或者乾脆利用IDE的自動完成功能,開發人員可以很容易發現,java.lang.Math.random()使用一個內部的隨機生成對象 - 一個很強大的對象可以靈活的隨機產生:布爾值、所有數字類型,甚至是高斯分布。例如:
new java.util.Random().nextInt(10)
它有一個缺點,就是它是一個對象。它的方法必須是通過一個實例來調用,這意味著必須先調用它的構造函數。如果在內存充足的情況下,像上面的表達式是可以接受的;但內存不足時,就會帶來問題。
一個簡單的解決方案,可以避免每次需要生成一個隨機數時創建一個新實例,那就是使用一個靜態類。猜你可能想到了java.lang.Math,很好,我們就是改良java.lang.Math的初始化。雖然這個工程量低,但你也要做一些簡單的單元測試來確保其不會出錯。
假設程序需要生成一個隨機數來存儲,問題就又來了。比如有時需要操作或保護種子(seed),一個內部數用來存儲狀態和計算下一個隨機數。在這些特殊情況下,共用隨機生成對象是不合適的。
並發
在Java EE多線程應用程序的環境中,隨機生成實例對象仍然可以被存儲在類或其他實現類,作為一個靜態屬性。幸運的是,java.util.Random是線程安全的,所以不存在多個線程調用會破壞種子(seed)的風險。
另一個值得考慮的是多線程java.lang.ThreadLocal的實例。偷懶的做法是通過Java本身API實現單一實例,當然你也可以確保每一個線程都有自己的一個實例對象。
雖然Java沒有提供一個很好的方法來管理java.util.Random的單一實例。但是,期待已久的Java 7提供了一種新的方式來產生隨機數:
java.util.concurrent.ThreadLocalRandom.current().nextInt(10)
這個新的API綜合了其他兩種方法的優點:單一實例/靜態訪問,就像Math.random()一樣靈活。ThreadLocalRandom也比其他任何處理高並發的方法要更快。
經驗
Chris Marasti-Georg 指出:
Math.round(Math.random() * 10)
使分布不平衡,例如:0.0 - 0.499999將四捨五入為0,而0.5至1.499999將四捨五入為1。那麼如何使用舊式語法來實現正確的均衡分布,如下:
Math.floor(Math.random() * 11)
幸運的是,如果我們使用java.util.Random或java.util.concurrent.ThreadLocalRandom就不用擔心上述問題了。
Java實戰項目裡面介紹了一些不正確使用java.util.Random API的危害。這個教訓告訴我們不要使用:
Math.abs(rnd.nextInt())%n
而使用:
rnd.nextInt(n)
英文出自:summa-tech
譯文出自:oschina
D. Java產生隨機數的幾種方式
方法1
(數據類型)(最小值+Math.random()*(最大值-最小值+1))
例:
(int)(1+Math.random()*(10-1+1))
從1到10的int型隨數
方法2
獲得隨機數
for (int i=0;i<30;i++)
{System.out.println((int)(1+Math.random()*10));}
(int)(1+Math.random()*10)
通過java.Math包的random方法得到1-10的int隨機數
公式是:最小值---最大值(整數)的隨機數
(類型)最小值+Math.random()*最大值
方法3
Random ra =new Random();
for (int i=0;i<30;i++)
{System.out.println(ra.nextInt(10)+1);}
通過java.util包中的Random類的nextInt方法來得到1-10的int隨機數
生成0到1之間的任意隨機小數:
生成[0,d)區間的隨機小數,d為任意正的小數,則只需要將nextDouble方法的返回值乘以d即可。
[n1,n2]
也就是 ra.nextDouble() * (n2-n1)+n1
E. 在java中產生隨機數
一、利用random方法來生成隨機數。
在Java語言中生成隨機數相對來說比較簡單,因為有一個現成的方法可以使用。在Math類中,Java語言提供了一個叫做random的方法。通過這個方法可以讓系統產生隨機數。不過默認情況下,其產生的隨機數范圍比較小,為大於等於0到小於1的double型隨機數。雖然其隨機數產生的范圍比較小,不能夠滿足日常的需求。如日常工作中可能需要產生整數的隨機數。其實,只要對這個方法進行一些靈活的處理,就可以獲取任意范圍的隨機數。
如我們可以先通過random方法生成一個隨機數,然後將結果乘以10。此時產生的隨機數字即為大於等於0小於10的數字。然後再利用Int方法進行轉換(它會去掉小數掉後面的數字,即只獲取整數部分,不是四捨五入)。最後即可獲取一個0到9的整數型隨機數字。其實現方法很簡單,就是對原有的random方法按照如下的格式進行變型:(int)(Math.Random()*10)即可。其實我們還可以對這個方法進行擴展,讓其產生任意范圍內的隨機數。至需要將這個10換成n即可,如改為(int)(Math.Random()*n)。此時應用程序就會產生一個大於等於0小與n之間的隨機數。如將n設置為5,那麼其就會產生一個0到5之間的整數型的隨機數。如果將這個寫成一個帶參數的方法,那麼只要用戶輸入需要生成隨機數的最大值,就可以讓這個方法來生成制定范圍的隨機數。在Java中定義自己的工具庫
有時候程序員可能需要生成一個指定范圍內的隨機偶數或者奇數。此時是否可以通過這個方法來實現呢?答案是肯定的。如現在程序要需要生成一個1-100范圍內的偶數。此時該如何實現?首先,需要生成一個0到99之內的隨機數(至於這里為什麼是99,大家耐心看下去就知道原因了)。要實現這個需求,很簡單吧,只要通過如下語句就可以實現: i=1+(int)(Math.Random()*100)。其中(int)(Math.Random()*99)產生0到99的整數型隨機數。然後再加上1就是產生1到100之間的隨機整數。然後將產生的隨機數賦值給變數i。但是此時其產生的隨機數即有偶數,又有奇數。而現在程序員需要的是一個隨機的偶數。那麼我們可以在後面加上一個if判斷語句。將這個隨機數除以2,如果沒有餘數的話(或者余數為0)則表明這個隨機數是偶數,直接返回即可。如果其返回的余數不為零,那麼就表明其是奇數,我們只要加上1就變為了偶數,返回即可。注意,在上面的隨機數生成中,筆者採用的范圍是0到99,然後再加上1讓其變為1到100的隨機數。最後的結果就是生成1到100之間的隨機偶數。其實,如果要范圍隨機奇數的話,至需要對上面的語句進行稍微的修改即可。Java:改變你我的世界
F. Java怎麼產生隨機數
一、利用random方法來生成隨機數。
在Java語言中生成隨機數相對來說比較簡單,因為有一個現成的方法可以使用。在Math類中,Java語言提供了一個叫做random的方法。通過這個方法可以讓系統產生隨機數。
二、通過Random類來生成隨機數。
在Java語言中,除了可以通過random 方法來產生隨機數之外,還可以通過一個random類來產生隨機數。程序開發人員可以通過實例化一個Random對象來創建一個隨機數的生成器。如 Random i=new Random()。通過這條語句就利用了Random類創建了一個隨機數的生成器。數
三、產生隨機的字元。
可以利用random方法來產生隨機字元。如可以利用代碼生成一個隨機的小寫字元:(char)(『a』+Math.random()*(『z』-『a』+1))。其實這跟生成任意兩個數之間的隨機數類似。通過以上的代碼就可以生成一個范圍之內的任意隨機字元。通過對這個代碼進行適當的修整,還可以生成任意兩個字元之間的隨機字元與任意大寫字元的隨機字元。其轉換的方式跟上面提到的任意范圍之內的隨機數類似。
G. 用JAVA產生[0,1]均勻分布的隨機數 要演算法
double rand(double []r)
{
double base,u,p,v,temp1,temp2,temp3;
base=256.0;
u=17.0;
v=139.0;
temp1=u*(r[0])+v; //就算總數
temp2=(int)(temp1/base);//計算商
temp3=temp1-temp2*base;//余數
r[0]=temp3;//更新隨機種子,為下一次使用
p=r[0]/base;//產生隨機數
return p;
}
其中base為基數,一般去2的整數倍,常數,u、v可以隨意取。數組r[]為只能去一個值的數組。如:double[]r={5.0}.
H. java關於Random的用法
在Java的API幫助文檔中,Random函數功能的描述:
1、java.util.Random類中實現的隨機演算法是偽隨機,也就是有規則的隨機,所謂有規則的就是在給定種(seed)的區間內隨機生成數字;
2、相同種子數的Random對象,相同次數生成的隨機數字是完全相同的;
3、Random類中各方法生成的隨機數字都是均勻分布的,也就是說區間內部的數字生成的幾率均等。
(8)java隨機數演算法擴展閱讀:
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。
Java具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態性等特點。Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等
語言特點:
1.簡單性:
Java看起來設計得很像C++,但是為了使語言小和容易熟悉,設計者們把C++語言中許多可用的特徵去掉了,這些特徵是一般程序員很少使用的。例如,Java不支持go to語句,代之以提供break和continue語句以及異常處理。Java還剔除了C++的操作符過載(overload)和多繼承特徵,並且不使用主文件,免去了預處理程序。
因為Java沒有結構,數組和串都是對象,所以不需要指針。Java能夠自動處理對象的引用和間接引用,實現自動的無用單元收集,使用戶不必為存儲管理問題煩惱,能更多的時間和精力花在研發上。
2.面向對象:
Java是一個面向對象的語言。對程序員來說,這意味著要注意應中的數據和操縱數據的方法(method),而不是嚴格地用過程來思考。在一個面向對象的系統中,類(class)是數據和操作數據的方法的集合。數據和方法一起描述對象(object)的狀態和行為。每一對象是其狀態和行為的封裝。類是按一定體系和層次安排的,使得子類可以從超類繼承行為。
在這個類層次體系中有一個根類,它是具有一般行為的類。Java程序是用類來組織的。Java還包括一個類的擴展集合,分別組成各種程序包(Package),用戶可以在自己的程序中使用。例如,Java提供產生圖形用戶介面部件的類(java.awt包),這里awt是抽象窗口工具集(abstract windowing toolkit)的縮寫,處理輸入輸出的類(java.io包)和支持網路功能的類(java.net包)。
3.分布性:
Java設計成支持在網路上應用,它是分布式語言。Java既支持各種層次的網路連接,又以Socket類支持可靠的流(stream)網路連接,所以用戶可以產生分布式的客戶機和伺服器。網路變成軟體應用的分布運載工具。Java程序只要編寫一次,就可到處運行。
4.編譯和解釋性:
Java編譯程序生成位元組碼(byte-code),而不是通常的機器碼。Java位元組碼提供對體系結構中性的目標文件格式,代碼設計成可有效地傳送程序到多個平台。Java程序可以在任何實現了Java解釋程序和運行系統(run-time system)的系統上運行。
在一個解釋性的環境中,程序開發的標准「鏈接」階段大大消失了。如果說Java還有一個鏈接階段,它只是把新類裝進環境的過程,它是增量式的、輕量級的過程。因此,Java支持快速原型和容易試驗,它將導致快速程序開發。這是一個與傳統的、耗時的「編譯、鏈接和測試」形成鮮明對比的精巧的開發過程。
參考資料:網路-java
I. 關於Java里產生1-6隨機數的方法
我認為2種方法產生的1~6的幾率是相等的,都為1/6.
第一種(int)(Math.random()*10)%6得到0~6的隨機數,每個數的產生的概率為1/7,再加上1,得到1~6的隨機數,0不再出現,每個數產生的幾率1/6.
另一種(int)(Math.random()*6)產生0~5,每個數產生的概率為1/6,再加上1,得到1~6的隨機數,每個數產生的幾率仍為1/6.
J. java如何產生1-8的整數隨機數
(int)(Math.random()*8)+1
或者
Random r =new Random(100);
System.out.println(r.nextInt(8)+1);
Java產生隨機數的兩種方式
1、通過Math.random()方法返回一個0到1之間的double值。
2、通過Random類來產生一個隨機數,這個是專業的Random工具類,功能強大。
Math.random()方法
Math.random()方法是 Java 的一個靜態方法,返回一個0到1之間,前閉後開區間的double值。
(int)(Math.random()*10) 返回0到9的隨機整數。
(int)(Math.random()*n) 返回0到n的隨機整數。
(int)(Math.random()*100)+1 返回1到100之間的隨機整數,前面返回0到99之間的隨機數,加1就成了1到100之間的隨機數。
Random類
Random 類是 Java 的 util 包中的一個類。
一、Random類使用說明
Random類使用的根本策略是分帶種子和不帶種子的Random的實例。
通俗說,兩者的區別是:帶種子的,每次運行生成的結果都是一樣的。
不帶種子的,每次運行生成的都是隨機的,沒有規律可言。創建不帶種子的Random對象
Random random = new Random();
使用一個和當前系統時間對應的相對時間有關的數字作為種子數。創建帶種子的Random對象有兩種方法:
1) Random random = new Random(10);
2) Random random = new Random();random.setSeed(10);
種子的作用是什麼?
種子就是產生隨機數的第一次使用值,機制是通過一個函數,將這個種子的值轉化為隨機數空間中的某一個點上,並且產生的隨機數均勻的散布在空間中。以後產生的隨機數都與前一個隨機數有關。
舉例:
Random r =new Random(100);
System.out.println(r.nextInt(20));
100是種子,r.nextInt(20)中的20是隨機數的上限,產生的隨機數為0-20的整數,不包括20,種子數只是隨機演算法的起源數字,和生成的隨機數字的區間沒有任何關系。
初始化時100並沒有起直接作用(注意:不是沒有起作用)。