2017-02-20 14 views
0

從ArrayList中重複我儲存我的號碼這樣的:如何產生0-9三個隨機數,而不在android系統

ArrayList<Integer> nr=new ArrayList<Integer>(); 

    nr.add(0); 
    nr.add(1); 
    nr.add(2); 
    nr.add(3); 
    nr.add(4); 
    nr.add(5); 
    nr.add(6); 
    nr.add(7); 
    nr.add(8); 
    nr.add(9); 

    Random r1 = new Random(); 
    Random r2 = new Random(); 
    Random r3 = new Random(); 

    int rnd1 = r1.nextInt(nr.size()); 
    nr.remove(rnd1); 
    int rnd2 = r2.nextInt(nr.size()); 
    nr.remove(rnd2); 
    int rnd3 = r2.nextInt(nr.size()); 
    nr.remove(rnd3); 

我嘗試刪除生成的數字,但它使一些嘗試後重復

+1

改組列表並刪除第一個/最後3個數字? –

回答

0

這裏的想法是,你正在生成一個範圍爲0..9的隨機數。然後刪除一個元素,並生成範圍爲0..8的另一個隨機數。您可以在0..7範圍內生成第三個數字。

正確的方法是使用您生成的數字作爲元素的索引。你拿這個指數的元素:這是你的「隨機」數字。然後你刪除這個元素,以便你不能再次使用它(在我的情況下,我使用一個操作獲取並刪除元素:「remove」)。

ArrayList<Integer> nr = new ArrayList<Integer>(); 

nr.add(0); 
nr.add(1); 
nr.add(2); 
nr.add(3); 
nr.add(4); 
nr.add(5); 
nr.add(6); 
nr.add(7); 
nr.add(8); 
nr.add(9); 

Random r = new Random(); 

int rndPos1 = r.nextInt(nr.size()); 
int rnd1 = nr.remove(rndPos1); 

int rndPos2 = r.nextInt(nr.size()); 
int rnd2 = nr.remove(rndPos2); 

int rndPos3 = r.nextInt(nr.size()); 
int rnd3 = nr.remove(rndPos3); 

System.out.println(rnd1 + ", " + rnd2 + ", " + rnd3); 
0

你可以從它shuffle您ArrayList和選擇第3項,像這樣:

import java.util.Arrays; 
import java.util.ArrayList; 
import java.util.Collections; 

class Main { 
    public static void main(String[] args) { 
    ArrayList<Integer> nr =new ArrayList<Integer>(); 
    nr.add(0); 
    nr.add(1); 
    nr.add(2); 
    nr.add(3); 
    nr.add(4); 
    nr.add(5); 
    nr.add(6); 
    nr.add(7); 
    nr.add(8); 
    nr.add(9); 
    System.out.println("The ArrayList looks like: " + Arrays.toString(nr.toArray())); 
    System.out.println("Three unique random numbers from it are:"); 
    //shuffle the list 
    Collections.shuffle(nr); 
    for(int i=0; i<3; i++) { 
     System.out.println(nr.get(i)); 
     nr.remove(i); 
    } 
    System.out.println("The ArrayList now looks like: " + Arrays.toString(nr.toArray())); 
    Collections.sort(nr); 
    System.out.println("Sorted: " + Arrays.toString(nr.toArray())); 
    } 
} 

實例應用:

The ArrayList looks like: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Three unique random numbers from it are: 
7 
8 
5 
The ArrayList now looks like: [6, 2, 3, 9, 4, 0, 1] 
Sorted: [0, 1, 2, 3, 4, 6, 9] 

試試吧here!

0

有是多件事情用你的代碼:
1.你不需要每次都創建新的隨機數。
2.因爲您事先掌握所有選項,您可能會遇到數組越界異常。

在循環中獲取隨機數並檢查,直到您有3個唯一的數字。
您的代碼看起來就像這樣:

ArrayList<Integer> nr=new ArrayList<Integer>(); 
nr.add(0); 
nr.add(1); 
nr.add(2); 
nr.add(3); 
nr.add(4); 
nr.add(5); 
nr.add(6); 
nr.add(7); 
nr.add(8); 
nr.add(9); 

Random r1 = new Random(); 
for(nr.size != 7) { 
    nr.remove(r1.nextInt(nr.size())); 
} 

這樣做將是另一個好辦法:

Collections.shuffle(nr); 
nr.remove(0); 
nr.remove(1); 
nr.remove(2); 
0

Random由種子產生隨機數。如果2 Random對象具有相同的種子,它們生成的隨機數將是相同的。默認情況下,這個種子是當前的系統時間。

在這裏,你創建了三個Random對象:

Random r1 = new Random(); 
Random r2 = new Random(); 
Random r3 = new Random(); 

由於代碼運行速度非常快,它們在同一毫秒創建的,因此它們的種子是相同的。結果,他們生成相同的隨機數。

的第一步,以解決您的代碼是創建只有一個Random

Random r = new Random(); 

下一步就是解決您從數組列表中隨機數的方法。你應該的rnd1rnd2指數在拿到項目,rnd3

int rnd1 = r.nextInt(nr.size()); 
int result1 = nr.get(rnd1); 
nr.remove(rnd1); 
int rnd2 = r.nextInt(nr.size()); 
int result2 = nr.get(rnd2); 
nr.remove(rnd2); 
int rnd3 = r.nextInt(nr.size()); 
int result3 = nr.get(rnd3); 
nr.remove(rnd3); 

result1-3是你不重複的隨機數!

我已經幫你清理你的代碼:

int index = r.nextInt(nr.size()); 
int result1 = nr.get(rnd1); 
nr.remove(index); 
index = r.nextInt(nr.size()); 
int result2 = nr.get(rnd2); 
nr.remove(index); 
index = r.nextInt(nr.size()); 
int result3 = nr.get(rnd3); 
nr.remove(index);