在J2ME中,由於大部分的游戲都會涉及到隨機性的事件,Random類自然就成為J2ME程序員經常使用的一個類了。但是對於新手來說,Random類看似簡單,也有可能會出現這樣那樣的錯誤。所以在這裡把我對於這個類的使用心得總結一下。
random類在CLDC1.0中就已經定義了。這個類有兩個構造函數Random() 和Random(long seed) 並且提供了四個常用方法:
next(int bits)
nextInt()
nextLong()
setSeed(long seed)
其中next(int bits)用來產生指定范圍的隨機數,即:
next(1)產生2的1次方之內的隨機數
next(2)產生2的2次方之內的隨機數
next(3)產生2的3次方之內的隨機數
...............................
next(n)產生2的n次方之內的隨機數
...............................
next(32)產生2的32次方之內的隨機數,就相當於nextInt()了
nextInt()用來產生隨機整數,最大2的32次方
nextLong()用來產生隨機長整數,最大2的64次方
setSeed(long seed) 用於設定隨機數的種子,即這裡的seed。隨機數種子的用處是:一般說來,這裡的Random類產生隨機數是偽隨機數,是系統采用特定的算法生成出來的,關於這一點我們可以采用一個試驗來證明。方法是new兩個Random類random1和random2。各自調用nextInt方法10次,我們可以看出,雖然各自產生的是隨機數,但是兩個Random類產生的隨機數都是一樣的。這就使得隨機數存在著漏洞。如果這樣的隨機數用在安全應用上面,就達不到預想的效果了。所以Random類提供了這個方法,以進一步提高隨機性。
在這裡需要特別為新手朋友們指出的是,我們在使用隨機數的時候,不能每次都new 一個 Random類出來,又不設定隨機數種子,因為那樣作的結果是,每次產生的隨機數都是一樣的。
將一個“錯誤”的例子寫在這裡:
import Java.util.Random;
import Javax.microedition.midlet.*;
public class J2ME extends MIDlet {
private Random random;
public J2ME() {
}
protected void startApp() throws MIDletStateChangeException {
for (int i = 0; i < 20; i++) {
random=new Random();
System.out.println(random.nextInt());
}
}
protected void pauseApp() {
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
這個例子產生的隨機數很多都是相同的。正確的做法應該是在 protected void startApp() throws MIDletStateChangeException 函數中做出如下修改
random=new Random();
for (int i = 0; i < 20; i++) {
System.out.println(random.nextInt());
}
關於Random類的總結就到這裡了,相信大家都可以正確使用這個類了。呵呵,請多關照。
MSN:
[email protected]