程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME隨機數

J2ME隨機數

編輯:J2ME

Java.util 套件之中有個Random 種別,負責用來產生隨機數(只能是int 或long 型別的隨機數)。所以應用前,我們必需先產生Random 種別,您可以用Random rdm = new Random(seedvalue) ;其中seedvalue 是隨機數種子。或者您也可以用Random rdm = new Random() ;這個建構式會在內部叫用this(System.currentTimeMillis());代表會根據當時的時間設定隨機數種子。任何時候我們也可以叫用setSeed()來設定隨機數種子,我們可以利用其nextInt()來產生int 型態的隨機數、nextLong()來產生long 型態的隨機數。

底下典范分辨產生10 個int 型態的隨機數與10 個long 型態的隨機數

//RandomTest.Javaimport Javax.microedition.midlet.*;import Javax.microedition.lcdui
 public void destroyApp(boolean unconditional) { }}

履行成果(由於是隨機數,每次產生的成果都不同):
773442310
-2109825643
-1768455644
2127084617
1315993862
643863720
1099764912
-349914351
1391929217
-1930539511
-65473852161141594
635052072394497921
-7151192063228537872
-424311676279222327
-6869450578076376049
6-6/47
-2480957207160828119
4260444547110204318
1034439773959919202
5039839362698545211
3284977682610163662

由上述典范可以得知,nextInt()產生的數值介於int 型態的范疇(2-31~231)之中。nextLong()產生的數值介於long 型態的范疇(2-63~263)之中。實在這兩個方法在內部都是叫用其next()方法,此方法需要一個參數,假如給定11,就會產生一個11 個bit 的隨機數。因此,extInt()的實作為:

public int nextInt()
{
    return next(32);
}

nextLong()的實作為:

public long nextLong()
{
    return ((long)next(32) << 32) + next(32);
}

假如我們想要自定隨機數產生的范疇,那麼就要動要到一些技巧。舉例來說,假如你想要產生-160~160 之間的數值,那麼我們就必需動用到余數運算符(%),

int res = rdm.nextInt()%160 ;

假如想要產生0~160 之間的數值,由於int 本身是有號數,而且為32 bits。必需把第一個bit 設定成0(代表正數)才行,我們可以應用:

int res = (rdm.nextInt() >>> 1)%160 ;

利用無號移位運算符。或

int res = (rdm.nextInt() & 0x7FFFFFFF)%160 ;

把第一個bit 設成0。兩種方法皆可。

假如想要產生-160~0 之間的數值,只要把第一個bit 設成1 即可。我們可以把上述產生正數的方法前面加上負號。或者也可以用:

int res = (rdm.nextInt() | 0x80000000)%160 ;

典范程序如下:

//RandomWithRangeTest.Javaimport Javax.microedition.midlet.*;import Javax.microedition
  public void startApp() { Random rdm = new Random(); //產生-160~+160 之間的隨機數 System.out.println("Range from -160 to + 160"); for (int i = 0; i < 5; i++) { System.out.println(rdm.nextInt() % 160); } //產生0~+160 之間的隨機數 System.out.println("Range from 0 to +160"); for (int i = 0; i < 5; i++) { System.out.println((rdm.nextInt() >>> 1) % 160); } //產生0~+160 之間的隨機數 System.out.println("Range from 0 to +160"); for (int i = 0; i < 5; i++) { System.out.println((rdm.nextInt() & 0x7FFFFFFF) % 160); } 
//產生-160~0 之間的隨機數 System.out.println("Range from -160 to 0"); for (int i = 0; i < 5; i++) { System.out.println( -(rdm.nextInt() >>> 1) % 160); } //產生-160~0 之間的隨機數 System.out.println("Range from -160 to 0"); for (int i = 0; i < 5; i++) { System.out.println( -(rdm.nextInt() & 0x7FFFFFFF) % 160); } //產生-160~0 之間的隨機數 System.out.println("Range from -160 to 0"); for (int i = 0; i < 5; i++) { System.out.println((rdm.nextInt() | 0x80000000) % 160); } }  public void pauseApp() { }  public void
destroyApp(boolean unconditional) { }}

履行成果:
Range from -160 to + 160
123
-63
-19
103
-145
Range from 0 to +160
158
64
73
30
72
Range from 0 to +160
62
122
141
75
83
Range from -160 to 0
-74
-115
-37
-144
-98
Range from -160 to 0
-2
-5
-153
-15
-32
Range from -160 to 0
-27
-151
-57
-72
-7

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved