2013-04-28 306 views
0

我已經找到了代碼中的一部分,我必須在每次按下按鈕(本例中爲r)時生成一個隨機數。當我按下這個按鈕時,我想讓它產生一個0到n之間的數字(在這種情況下是3),但我不希望它產生一個以前產生的數字。所以我不希望連續兩次生成相同的數字。所以2然後2是不好的。 2然後0然後2是好的。如何用r.nextInt()生成除一個數字之外的隨機數字?

我環顧四周,看到類似於我的問題,但沒有一個真的有幫助。除數組或其他數字外,其他人都會生成一次。我不斷生成,我希望能夠檢測到以前的相同數字。

我使用的隨機類,我已經考慮使用math.random類,但是這是0和1之間,所以這不是太有用。任何幫助將不勝感激,謝謝! :d

+2

你怎麼樣產生一個隨機數,並檢查它的與剛剛生成的相同。如果是,則生成一個新的隨機數。重複,直到你得到新的東西。這是基本的編程,沒什麼複雜的。 – jahroy 2013-04-28 18:05:26

+0

你可以用你想控制隨機數範圍的任意數字乘上math.random()的結果(0和1之間的一個值)。 – jahroy 2013-04-28 18:09:43

+0

對不起,如果我迷惑任何人。當我生成一個數字時,我不希望它與前一個生成的數字相同。其他數字都可以。此外,我試着檢查它是否是相同的數字,直到我得到新的東西,但我在代碼中遇到了麻煩。感謝您的幫助傢伙btw :) – 2013-04-28 18:13:13

回答

2

你可以做這樣的事情

int[] values = new int[360]; 
values[0] = random.nextInt(n+1); 
for(int i = 0; i < values.length; i++) { 
    values[i] = random.nextInt(n); 
    if (values[i-1] == values[i]) values[i] = n; 
} 
+0

對不起,這不是太有用 - 我沒有指定,但我需要生成360數字,並確保它不會產生兩次相同的數字。但謝謝你的回答! – 2013-04-28 18:00:57

+0

@HaydenPerry哦,在這種情況下,你將不得不使用循環。我希望你知道如何使用其中之一? ;) – 2013-04-28 18:01:55

4

既然你有N個可能值第一,只有N-1的後續,只是用randInt可根據您是否是一個不同的觀點是否產生第一個值。試圖對所有迭代使用相同參數的randInt將導致非平坦分佈。

class NoAdjacentPRNG implements Iterator<Integer> { 
    private final Random rnd; 
    private final int range; // 3 to generate numbers in [0, 2). 
    private Integer last; 

    NoAdjacentPRNG(Random rnd, int range) { 
    this.rnd = rnd; 
    this.range = range; 
    } 

    public boolean hasNext() { return true; } 
    public Integer next() { 
    int n; 
    if (last == null) { 
     // The first time through, there are range possible values. 
     n = rnd.nextInt(range); 
    } else { 
     // There are only range-1 possible values given that the 
     // last is excluded. 
     n = rnd.nextInt(range - 1); 
     // Work around last. 
     if (n >= last) { ++n; } 
    } 
    last = n; 
    return n; 
    } 

    public void remove() { throw new UnsupportedOperationException(); } 
} 
+1

@PeterLawrey,重寫使毗鄰唯一的限制。 – 2013-04-28 18:05:19

+0

你沒有初始化你的變量! – Jyro117 2013-04-28 18:07:22

+0

@ Jyro117,哪? – 2013-04-28 18:16:18

5

記住上次生成的內容;重複發生,直到它們是不同的

你說你想要的數字0-9

do 
{ 
    int n = Random.nextInt(10); 

} while (n == prev) // prev is the number you generated previously 
prev = n; 
+0

根據問題的寫法,這是解決方案。沒有必要讓它變得複雜! – jahroy 2013-04-28 18:10:55

1

你甚至可以超簡單:

public class NonRepeatingRandom extends Random { 
    private int last = -1; 
    @Override 
    public int nextInt(int i) { 
    int next = super.nextInt(i); 
    while (next == last) { 
     next = super.nextInt(i); 
    } 
    return last = next; 
    } 
}