2013-03-25 101 views
0

我需要隨機獲取數字1-4並將其存儲在arrayList中。我有一個好的開始,但我可能會有一個無限循環,因爲模擬器不斷崩潰。這些數字也不能被使用一次以上。Android獲得4個隨機數

** lightSelector is a global variable (int lightSelector = 1;) 
** generatedOrder is my ArrayList 

for (int i = 0; i < 4; i++) 
{ 
     lightSelector = 1 + (int)(Math.random() * 4);   
     generatedOrder.add(lightSelector); 
     boolean contains = true; 
     System.out.print(generatedOrder.get(i)); 
     if (!generatedOrder.isEmpty()) 
     { 
      // Loop until a number is generated that hasn't already been picked 
      while (contains) 
      { 
       if (generatedOrder.contains(lightSelector)) 
        lightSelector = 1 + (int)(Math.random() * 4); 
       else 
       { 
        generatedOrder.add(lightSelector); 
        contains = false; 
        break; 
       }  
      } 
     } 
    } 
+0

如果發生崩潰,您將得到一個logcat輸出。這是什麼意思? – 2013-03-25 03:49:40

+0

打開跟蹤文件時出錯:沒有這樣的文件或目錄(2) – Andrew 2013-03-25 03:51:13

+0

它會更長。大約10-30行。紅色或黃色。編輯它到您的問題 – 2013-03-25 03:52:15

回答

2

一種更有效的方式在一個隨機排序,以獲得四個數字是執行以下算法:

1)創建一個int []數組如{1,2,3,4} ;

2)對於i = 0;我< array.length; ++ i,在i和array.length-1之間產生一個隨機數j,其中包括和交換i和j。

重要提示:這意味着可能的互換將遵循00,01,02,03後面緊跟着的一個22,23的11,12,13一個一個由33一個這給你所有4 * 3 * 2 * 1 = 4!排列數組的方法,這是算法正確所必需的。

(如果,例如,你有4^4 = 256的算法來完成可能的方式,24不進入256均勻,所以一些洗牌會更可能出現比其他人。)

該混洗算法有一個名字:Fisher-Yates Shuffle

編輯:一個好方法中的整數範圍內產生的隨機數是執行以下操作:

1)生成Random rng = new Random();恰好一次。不要再創建一個新的,因爲如果你在同一時間創建兩個Random實例,它們會給出完全相同的隨機數字流。

2)隨機有一個方法,nextInt(n)返回一個0和n-1之間的隨機int,因此得到i和j之間的隨機數,包括do nextInt(j+1-i)+i。要獲得i和j之間但不包括j的隨機數,請執行nextInt(j-i)+i

API參考號:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html

+0

要生成隨機數j,除了更改最大值/最小值之外,是否應該使用與lightSelector相同的邏輯? – Andrew 2013-03-25 03:57:21

+0

@Andrew我按我喜歡的方式編輯成我的答案。 – Patashu 2013-03-25 04:02:07

+0

謝謝!我會給它一個鏡頭。 – Andrew 2013-03-25 04:05:40