2011-04-27 45 views
2

任何人都可以幫助我製作一個方法來產生隨機數,而無需在Android重複? 最大數量爲:prjcts.size();這是我的JSON數組。返回值應該是整數。android:生成沒有重複的隨機數

我已經有的是: int i = (int)(prjcts.size() * Math.random());我鑄造的方法3次,因爲我需要3個隨機生成的數字。它有效,但我不知道如何不重複。所以這三個數字在彼此之間不會相同。

謝謝

+0

沒有重複在一個循環或在一個運行時或什麼? – Fredrik 2011-04-27 16:43:15

+0

我做了這個int i =(int)(prjcts.size()* Math.random());用不同的變量3次。因爲我需要3個隨機生成的數字,最大值是我的JSON條目的最大數量。它的作品,但我不知道如何不重複。所以這三個數字在彼此之間不會相同。 Thx – hectichavana 2011-04-27 16:45:02

回答

5

您是否嘗試過只用Math.random()

只是做一些鑄造魔術,你會好起來:

int index = (int)((double)prjcts.size() * Math.random()); 

編輯:

如果你想避免重複,您可以創建與所有可能的索引列表。

int max = prjcts.size(); 
List<int> indices = new ArrayList<int>(max); 
for(int c = 0; c < max; ++c) 
{ 
    indices.add(c); 
} 

那麼你一定要隨機指數每一次,只是隨機選擇一個項目從列表,從列表中刪除後它,當你完成

int arrIndex = (int)((double)indices.size() * Math.random()); 
int randomIndex = indices.get(arrIndex); 
indices.remove(arrIndex); 

randomIndex現在保證是從未使用過的JSON列表的索引。

+0

是的,我已經完成了這之前:int i =(int)(prjcts.size()* Math.random());它的作品,但我不知道如何不重複。所以這三個數字在彼此之間不會相同。 Thx – hectichavana 2011-04-27 16:47:45

+0

謝謝!這是我最喜歡的解決方案! :) – hectichavana 2011-04-28 11:52:18

+1

沒問題,但說實話,我不知道'Collections.shuffle()'。 Haphazard的解決方案是完成完全相同的事情的更簡潔的方式。 – 2011-04-28 15:51:52

10

我在你的其他問題中提及如何做到這一點..

List<Integer> list = new ArrayList<Integer>(); 
int jsonMax = prjcts.size(); 
for(int i = 1; i<=jsonMax; i++) 
    list.add(i); 

Collections.shuffle(list); 

for(int i=0; i<jsonMax; i++) { 
    int n = list.get(i); 
    //n is a random, unique number between 1 and prjcts.size() 
} 
+0

生成器從未被引用,爲什麼它需要? – unwind 2011-04-27 16:54:19

+0

我剛剛刪除它 - 好。另外,感謝修正Itay。 – Haphazard 2011-04-27 16:54:59

+1

次要優化:將ArrayList的大小預設爲prjcts.size()以避免多次分配。 – Anm 2011-04-27 17:19:44

1

的一種方法,從0與出重複獲得N個隨機數到N-1是創建這N個數字陣列和創建一個隨機數字,它將選擇該數組的一個索引。然後從該數組中刪除索引,並繼續使用N-1號碼等。

class NoRepeatRandom 
{ 
    private int[] number = null; 
    private int N = -1; 
    private int size = 0; 
    public NoRepeatRandom(int minVal, int maxVal) 
    { 
    N = (maxVal - minVal) + 1; 
    number = new int[N]; 
    int n = minVal; 
    for(int i = 0; i < N; i++) 
     number[i] = n++; 
    size = N; 
    } 

    public void Reset() { size = N; } 

    // Returns -1 if none left 
    public int GetRandom() 
    { 
    if(size <= 0) return -1; 
    int index = size * Math.random(); 
    int randNum = number[index]; 

    // Swap current value with current last, so we don't actually 
    // have to remove anything, and our list still contains everything 
    // if we want to reset 
    number[index] = number[size-1]; 
    number[--size] = randNum; 

    return randNum; 
    } 
} 

void Test() 
{ 
    NoRepeatRandom nrr = new NoRepeatRandom(0, 10); 
    for(int i = 0; i < 12; i++) 
    System.out.println("Random number: " + nrr.GetRandom()); 
} 
0

爲了什麼它的價值,你可以嘗試使用Mersenne Twister算法,其中有一個Java實現它here。 Mersenne Twister是一個隨機數發生器,其週期爲2^19937 - 1,因此幾乎保證不會得到相同的隨機數。