1. 程式人生 > >Android下產生隨機數的方法的選擇

Android下產生隨機數的方法的選擇

首先介面上放一個TextView控制元件,一個Button按鈕,要實現點選按鈕,改變文字控制元件的文字的顏色。其實實現起來並不難,而且是特別簡單的那種,但是我遇到了一些問題,經過和同學與老師的一番討論,總結了一下產生隨機數的方法的使用。

我們完成初始化介面和對Button設定點選事件doClick後,在方法裡這樣寫:

Random random = new Random();
int red = random.nextInt(256);
int green = random.nextInt(256);
int blue = random.nextInt(256);
tv1.setTextColor(Color.rgb(red, green, blue));
 
 

樓主認為這種是寫得還不錯的一種,但是我為了偷懶,並沒有定義red,greed,blue變數,而是在Color.rgb()方法裡直接new出了三個Random物件作為引數。

      

tv1.setTextColor(Color.rgb(new Random().nextInt(256),new Random().nextInt(256), new Random().nextInt(256)));

這看上去好像也沒什麼不同的,但實際執行後我就發現了大有不同!!! 第一種點選按鈕顏色變換十分的均勻,顏色變化明顯,但是第二種變換時而明顯,時而不明顯,這是到底是怎麼回事呢?
我剛開始以為是我產生隨機數的方法不對,我又使用了另一種方法產生隨機數, 於是我嘗試了另一種寫法:
   tv1.setTextColor(Color.rgb((int) (Math.random() * 256),(int)( Math.random() * 256), (int) (Math.random() * 256)));
我發現這種寫法與只用一個Random物件一樣,顏色變化十分的均勻。於是我比較了一下兩種產生隨機數的方法:我發現Math.random()裡面也是呼叫的Random的構造方法,而且Random產生隨機數是根據系統當前的時間加上一個HashCode的值作為生產種子,切生產種子是使用synchronized修飾的,但不同的是Math.random()方法使用了同步synchronized修飾,說明此方法時執行緒安全的,而Random則沒有,所以在呼叫Color.rgb()方法時,第一種方法產生的三個執行緒會互相的干擾,而第二種則不會,但是第二種會較為消耗系統資源,所以我們根據不同的情況來使用Random和Math.random兩種產生隨機數的方法,若想使顏色變化均勻,如果有多個執行緒同時產生隨機數,使用第二種Math.random()更安全,代價是會影響可擴充套件性,若只有單個執行緒想產生隨機數,也就是隻用一個物件產生隨機數時,推薦使用Random。