2013-08-24 18 views
0

在我的程序中,我使用了一個隨機生成器。如何使兩次不生成數字?

Random random = new Random(); 

//How i use it 
int i = random.nextInt(numberNeeded); 

的問題是,是,我需要找到每個號碼只能得到一次產生的方式。所以我猜它不是完全隨機的....例如....當數字1生成時,我不希望它被再次調用,而是調用其他數字之一...像2,3或4 ......然後,當4調用它只能撥打2或3 ..

那麼下一次,這些數字變得洗牌,然後重複此過程...

數字將需要從4範圍到16

回答

0

第一次啓動應用程序時,首先確保您只執行一次new Random()。其次,記住變量中的最後一個值,並永遠循環,直到它不匹配爲止。

Random random = new Random(); 

int lastNumber = -1; 

while (true) 
{ 
    int i = random.nextInt(numberNeeded); 
    if (i == lastNumber) continue; 
    lastNumber = i; 
    break; 
} 
+0

它僅在第一次迭代時失敗bcoz如果i = 4第一次迭代然後如果(i == lastNumber)返回false,因爲i = 4並且lastNumber = -1因此循環中斷 –

7

它可能會更容易,你想從選擇的元素列表上使用Collections.shuffle

ArrayList<Integer> numbers = new ArrayList<Integer>(); 
for (int i=4; i<=16; i++) 
    numbers.add(i); 
Collections.shuffle(numbers); 
// numbers is now in a random order and contain the numbers 4 through 16 
+0

所以我將如何生成一個隨機數這個?如int = random.nextInt() –

+3

@ coder_For_Life22 - 第一個隨機數將是'numbers.get(0)','second numbers.get(1)'等。 – ianhanniballake

0

至16加號4到一個ArrayList然後用集合將它洗。洗牌(...)。然後他們返回ArrayList中爲了

0

您可以使用Collections.shuffle ...

  //Setup your list as needed... 
    final List<Integer> list = new ArrayList<Integer>(); 
    list.addAll(Arrays.asList(new Integer[] { 
      1, 2, 3, 4 })); 


    // Randomizes the list 
    Collections.shuffle(list); 

    for (Iterator<Integer> i = list.iterator(); i.hasNext();) { 
     System.out.println(i.next()); 
        //Removes from the list... 
     i.remove(); 
    } 
0

也許不是最好的方式,但最直接的方法是使用一個布爾數組。

//create an array of boolean values set to TRUE 
boolean[] isavailable = new boolean[somesize]; 
Arrays.fill(isavailable, Boolean.TRUE); 

//Get a random number 
Random r = new Random(); 
int myrandomnumber=r.nextInt()%25; //Im just going to use 25 for example 

if (isavailable[myrandomnumber]) 
{ 
    isavailable[myrandomnumber]=false; 
    //do whatever you want with the number here 
} 
else 
{ 
    //Generate another random number here 
} 

在所有誠實,所以最好把這個變成一個while循環,如果生成連續兩個以上的不可用的數字,您覆蓋這種方式,但是這應該給你的基本理念。