2014-01-19 140 views
2

我目前正在創建一個應用程序,它會生成隨機數。所以每次它會生成三個數字num1,num2和num3。這些數字不應該重複。例如,如果num1 = 1比num2和num3不能等於1.我試過這個代碼,它將顯示從0-2範圍內的三個不同的數字。它的工作。不過,我想要生成範圍從1-3,2-4,3-5等的隨機數。那麼我怎樣才能通過使用下面的代碼來實現這一點。請幫助我,因爲我是新手。謝謝。生成一定範圍內沒有重複的隨機數

for(int i=0; i<images.length; i++) 
{ 
     num[i] = (int)(Math.random()*3); 

     if (i == 0) 
     { 
     if(num[i]== 0) 
      images[i].setImageResource(R.drawable.zero); 
     else if(num[i]==1) 
      images[i].setImageResource(R.drawable.one); 
     else 
      images[i].setImageResource(R.drawable.two); 
     } 

     else 
     { 
      while (num[i] == num[i-1] || num[i] == num[0]) 
       num[i] = (int)(Math.random()*3); 


     if(num[i]==0) 
      images[i].setImageResource(R.drawable.zero); 
     else if(num[i]==1) 
      images[i].setImageResource(R.drawable.one); 
     else 
      images[i].setImageResource(R.drawable.two); 

     } 
    } 
+1

你的問題不是很清楚,你必須表達得更好。 –

+0

我幾乎可以肯定,我已經看到了這個副本。 [這個問題](http://stackoverflow.com/questions/5224877/java-generate-random-range-of-specific-numbers-without-duplication-of-those-nu?rq=1)也非常接近。在處理這個時,我實際上是繼承[Random](http://docs.oracle.com/javase/7/docs/api/java/util/Random.html),允許注入/配置更改。 –

+0

由於@ Clockwork-Muse提到,你可以從需要的範圍[洗牌值列表](http://stackoverflow.com/a/5224922/125562)。 – Basilevs

回答

1

那麼,你可以存儲你的號碼一個ArrayList<>。每次您生成一個隨機數時,請查看ArrayList<>是否包含該數字。如果是,則生成另一個號碼並重復該過程。

更好的是,使用Set <>

0

要獲得數爲1-3,2-4,3-5,等等,改變這種

num[i] = (int)(Math.random()*3); 

這個

num[i] = rand.nextInt(2) + 1 + i; 

你需要導入Random並添加使用前請使用Random rand = new Random();

0

以產生範圍內的隨機數的公式是:

Random rn = new Random(); 
    int range = maximum - minimum + 1; 
    int randomNum = rn.nextInt(range) + minimum; 

因此在一個行中,可以產生作爲這樣

int num1 = new Random().nextInt(3-1+1) + 1; 
    int num2 = new Random().nextInt(4-2+1) + 1; 
    int num3 = new Random().nextInt(5-2+1) + 1; 

num[i] = new Random.nextInt(range[i]) + 1 + i; 

然後就可以做你的邏輯東西來設置資源。 快樂編碼:)

0

生成和存儲唯一編號的最佳可能和最有效的方法是創建一個包含您的數據的HashSet。生成數字,然後嘗試將其添加到HashSet。如果add方法返回false,則表示該數字已經存在於該集合中,因此會重新生成一個數字。 在ArrayList上使用此方法的優點是,使用contains()方法(來自ArrayList)的時間複雜度爲O(n),這會導致時間複雜度爲O(n) - 效率隨着大小的增加而降低。

+1

由於嘗試失敗,這絕對不是最有效的方式。 – Basilevs

+0

理想的情況是生成已知是唯一的數字,但這對於Math.random()是不可能的。我認爲OP想要儘可能貼近他的原始代碼。我的首要任務是查找數字的最快方法是獨特的,因爲您正在使用Math.random()。 – ucsunil

+0

使用Math.random()獲取唯一整數沒有意義。推薦使用Random.nextInt()獲得隨機數。 – Basilevs

10

創建一個列表,如果在範圍內的所有號碼,然後改組列表:

List<Integer> numbers = new ArrayList<>(); 
// eg for range 3-5 
for (int i = 3; i <= 5; i++) 
    numbers.add(i); 
Collections.shuffle(numbers); 

現在在新的(隨機)順序使用它們。

除非你的範圍很大(百萬),這將工作正常。


Java8版本:

List<Integer> numbers = IntStream.rangeClosed(3, 5).boxed().collect(Collectors.toList()); 
Collections.shuffle(numbers); 
+0

要在3-5之間生成,您必須使用條件_i <= 5_ –

+0

@Digital_Reality Doh!謝謝。 – Bohemian

+0

在Java 8中,您可以不使用'IntStream.range(3,6).collect(Collectors.toList())' – SOFe

0

int base = (int)Math.random(); System.out.print(base);

int change = ((int)Math.random()) % 3;

if(change == 0) { change++; System.out.print(base + 1); System.out.println(base + 2); }

else { System.out.print(base + 2); System.out.println(base + 1); }

0

您也可以使用隨機數生成,以填補HashSet的一個固定的範圍。

0
Integer[] a = new Integer[3]; 
Random r = new Random(); 
for (int i = 0; i < a.length; i++) { 
     a[i] = r.nextInt(3-1) + 1; 
} 
Collections.shuffle(Arrays.asList(a), r); 
+0

你確定你想每次都要實例化一個新的'Random'實例嗎? – SOFe

+0

每次不需要.. – Suresh

+0

這就是爲什麼你應該將'Random'行移出循環。 – SOFe

0

我知道這是晚了,但可能有助於未來的參考。 您可以創建自己的自定義Random類:

//Generates random integers without repetition between two given numbers both inclusive 
public class Random { 
    private int start; 
    private int end; 
    private Stack<Integer> numbers = new Stack<>(); 
    public Random(int start, int end){ 
     this.start = start; 
     this.end = end; 
    } 
    private void loadNumbers(){ 
     for (int i=start;i<=end;i++){ 
       numbers.push(i); 
      } 
     Collections.shuffle(numbers); 
    } 
    public int nextInt(){ 
     if (numbers.empty()) loadNumbers(); 
     return numbers.pop(); 
    } 
} 

而且使用它像:

Random rand = new Random(1,20); 
for(int i=0; i<100;i++){ 
    System.out.print(rand.nextInt()+ " "); 
} 
0

減少總量每次運行,並適當增加的結果。

static int[] randomRange(Random random, int cap, int count) { 
    assert count < cap && count > 0 && cap > 0; 
    int[] output = new int[count]; 
    // initial placeholder. use 0x7FFFFFFF for convenience is also OK. 
    Arrays.fill(output, -1); 
    for(int i = 0; i < count; i++) { 
     // you only have (cap - i) options left 
     int r = random.nextInt(cap - i); 
     // iterate through a sorted array 
     for(int got : output) { 
      // ignore placeholders 
      if(got != -1 && got <= r) { 
       // the generated random int counts number of not-yet-picked ints 
       r++; 
      } 
     } 
     // add to array in a sorted manner 
     addToArray(output, r); 
    } 
    return output; 
} 

static void addToArray(int[] array, int value) { 
    for(int i = 1; i <= array.length; i++) { 
     if(i == array.length || array[i] >= value) { 
      // shift smaller values one place left 
      // this includes -1. If you use 0x7FFFFFFF, 
      // you may have to sort the array the other way round. 
      System.arraycopy(array, 1, array, 0, i - 1); 
      array[i - 1] = value; 
      return; 
     } 
    } 
} 

該算法有一個缺點,即它的輸出被排序。當然,也可以跟蹤兩個數組,一個排序(用於增量)和一個未排序(用於返回)。

上面的代碼片段通過cap = 20, count = 10cap = 20, count = 20每次測試兩次。

相關問題