2010-08-03 89 views
1

這就是我如何在1到6之間生成一個唯一的no,並從可繪製文件夾中獲取適當的圖像。如何擁有唯一的隨機數?

Random rand = new Random(); 
// n = the number of images, that start at idx 1 
rndInt = rand.nextInt(6) + 1; 
String imgName = "card" + rndInt; 
int id = getResources().getIdentifier(imgName, "drawable", getPackageName()); 
imgView.setImageResource(id); 

我想要的是,我必須調用這個方法7次,每次這個方法應該返回一個唯一的隨機號碼。所以沒有一個已經選擇的數字會再次出現。

+1

如果只有6個可能的值,你打算怎麼獲得7個唯一的號碼? – 2010-08-03 11:14:44

+10

「唯一」和「隨機」是互斥的。你不能擁有兩個。 – 2010-08-03 11:18:13

+0

@丹代爾先生我的壞。我把它改爲7. @greg D ..夥計,PLZ C被接受的answr..that代碼創建了一個獨特的和贖金沒有。 – iscavengers 2010-08-03 12:05:47

回答

37

這種問題的常見方法是創建一個列表,其中包含每個可能的值並將其拖動(使用Collections.shuffle)。每次你需要一個值時,你從列表中消耗一個項目。這將確保您不會多次使用相同的值,但仍允許隨機訂購。

+0

它看起來像你用這個來洗牌。加載所有的卡片,然後洗牌會不會更好?該方法與此答案類似。 – 2010-08-03 12:03:21

+3

+1比接受的答案好得多。我想知道你的代碼是否已被接受。 – MAK 2010-08-03 12:26:36

-4

創建一個你已經獲得的可能性的靜態列表。

static ArrayList<int> listIdontWantAnymore = new ArrayList<int>(); 

int NextRandomNumber() { 
    Random random = new Random(); 
    int myRandomInt; 

    do { 
     myRandomInt = random.NextInt(6) + 1; 
    } while(listIdontWantAnymore.Contains(myRandomInt)); 

    listIdontWantAnymore.Add(myRandomInt); 

    // now your 'myRandomInt' is what you want it to be. 
    return myRandomInt; 
} 
+4

我認爲像這樣的解決方案應該有失效保護系統來避免死鎖。它可能會壞的;) – monoceres 2010-08-03 11:27:30

+0

這是完美的,人.. dat wat我waz尋找,現在我能夠創建一個獨特的隨機數 非常感謝。 – iscavengers 2010-08-03 12:04:27

+6

@ shishir.bobby:不,那並不完美。那真是太可怕了。請不要使用這個「解決方案」。 – 2010-08-03 12:20:51

8

下面是一個使用Dan Dyer建議的方法創建隨機排列的示例類。它確保每個.next()調用都給出一個新的數字,直到構造函數中給出的數字爲止。之後,它會環繞並再次提供相同的序列。 這對洗牌播放列表很有用。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class RandomPermutation{ 
    private List<Integer> list; 
    private int index; 

    /** 
    * Create a random permutation the sequence of numbers 0, 1, ... , n - 1. 
    * @param n Range specifier, must be positive 
    */ 
    public RandomPermutation(int n) { 
     if (n <= 1) { 
      throw new IllegalArgumentException(
        "Positive number expected, got: " + n); 
     } 
     list = new ArrayList<Integer>(); 
     newList(n); 
    } 

    /** 
    * Creates a new list 
    */ 
    public void newList(int n) { 
     index = -1; 
     list.clear(); 
     for (int i = 0; i < n; i++) { 
      list.add(i); 
     } 
     Collections.shuffle(list); 
    } 

    /** 
    * Retrieve the next integer in sequence. 
    */ 
    public int next() { 
     index = (index + 1) % list.size(); 
     return list.get(index); 
    } 
} 

Btw。不要使用Snake使用的方法。 這不僅僅是因爲一旦所有的數字都被使用,它會凍結。這可以修復。 由於越來越多的數字在listIdontWantAnymore中,問題在於程序運行速度越來越慢。只有6個數字不是問題,但如果範圍很大,它可能會導致相當大的減速。考慮選擇10000個數字。在選擇了9900個數字後,有1%的機會擊中一個好數字。後9990號有創下了相當數量等

這裏的0.1%的機率是你如何使用類的一個示例:

static RandomPermutation randomPerm = new RandomPermutation(7) 

int NextRandomNumber() { 
    return randomPerm.next() + 1; 
} 
+0

謝謝zeriab,我實現了你的方法,它的工作f9。 可以告訴我一件事, 像你一定要看到一個計時器,倒數計時器,顯示值從10到0,在視圖中可見。 我如何顯示隨機數字不斷更改我的看法。 再次感謝隊友 – iscavengers 2010-08-06 11:33:28

1

您的特定用例,這應該做的訣竅。

Random rand = new Random(); 
// n = the number of images 
List<String> imgNames = new ArrayList<String>(n); 
for (int i = 0; i < n; i++) { 
    imgNames.add("card" + (i + 1)) 
} 
while (!imageNames.isEmpty()) { 
    String imgName = imgNames.remove(rand.next(imageNames.size()); 
    int id = getResources().getIdentifier(imgName, "drawable", getPackageName()); 
    imgView.setImageResource(id); 
} 

請注意,這不能很好地擴展,因爲n變大。對於ArrayListLinkedList,刪除操作是O(n)。但是對於成百上千的n,與加載和顯示圖像相比,這可能是微不足道的。

此外,正如評論指出的「獨特的隨機數」是一個矛盾的術語。你在後面是從1n的一組數字的隨機置換。我的解決方案在沒有明確的「洗牌」步驟的情況下爲您提供了這一點,這對您的使用情況已足夠。

+0

我會說這很清楚,「獨特的隨機數」意味着同一個樣本不應該被挑選超過一次。 在附註上:LinkedList上的removeFirst()操作是O(1)。 – Zeriab 2010-08-03 13:00:41

+0

@Zeriab - *「LinkedList上的removeFirst()操作是O(1)」*。這有什麼關係?該算法不使用該方法。 – 2010-08-03 13:35:21

+0

@Zeriab - 「獨特的隨機數」對你來說可能很清楚,但從數學的角度來看這是無稽之談。有點像討論允許重複的集合。 – 2010-08-03 13:39:36

1

生成包含您將使用的每個數字的數字列表。 (這很好,因爲我們正在談論一個小範圍,其中「N」是「某處少於一千個」)

當您選擇一個數字時,請選擇一個介於0和sizeof(list)之間的隨機索引,該數字成爲該列表的索引。

刪除該列表索引並返回該數字。

(這是一個鍛鍊的讀者,以確定什麼樣的「名單」是適當的在這裏。)

2

這裏是最簡單的代碼來做到這一點,並存儲到一個數組中沒有任何重複:

Random rand = new Random(); 
int[] ar; 
ar = new int[5]; 

int random = 0; 
int [] result_arr=new int[5]; 
boolean flag=false; 

for(int i=0;i<5;i++) 
{ 
    ar[i]=0; 

    do{ 
     random =rand.nextInt(10); 
     flag=false; 
     for(int j=0;j<i;j++) 
     { 
      if(ar[j]==random) 
      flag=true; 
     } 
     if(!flag) 
     { 
      ar[i]=random; 
      break; 
     } 
    } 
    while(true) ; 
} 

這將在陣列中創建獨特的數字