簡體   English   中英

在Java中生成范圍內的非重復隨機數

[英]Generate non repeating random number within range in Java

我想生成1到4,4范圍內的隨機數,包括。
這是我的代碼:

int num = r.nextInt(4) + 1;  //r is instance of Random.

但是,我在循環中運行上面的代碼,不想重復隨機數。 現在發生的事情通常是我得到的:
1,1,1,2,3,1,4,2,2,1,4,2,4,4,2,1,4,3,3,1,4,2,4,1作為我的輸出。

這里,盡管數字在范圍(1-4)內是隨機的,但是經常在前3次迭代中像數字“1”一樣重復。

我正在尋找的是一種在循環中獲得非重復隨機數的方法。 我知道的一個簡單方法是在當前迭代之前保留最后一個隨機數並進行比較,但我相信必須有更好的解決方案。
提前致謝。

使用random.nextInt(range-1) ,然后使用排除前一個數字的函數將該數字映射到輸出數字:

public class Test {
  private final Random random = new Random();
  private final int range;
  private int previous;

  Test(int range) { this.range = range; }

  int nextRnd() {
    if (previous == 0) return previous = random.nextInt(range) + 1;
    final int rnd = random.nextInt(range-1) + 1;
    return previous = (rnd < previous? rnd : rnd + 1);
  }


  public static void main(String[] args) {
    final Test t = new Test(4);
    for (int i = 0; i < 100; i++) System.out.println(t.nextRnd());
  }
}

因為你有更多的數字,你必須重復一些數字。 您所能做的就是盡量減少重復次數。

一種方法是使用Collections.shuffle,它允許您以隨機順序包含數字,無需重復,每次都這樣做。 您可以防止重復上一個N值。

要停止連續重復的數字,您可以減小范圍並使用模數。

int n = 0, max = 4;
Random rand = new Random();

for(int i = 0; i < numbers; i++) {
   n = (n + rand.nextInt(max-1)) % max;
   int numToUse = n + 1;
   // use this number.
}

這項工作實際上只有max-1可能的值,因為您排除了最后使用的值。

沒有“更好”的答案。 你得到一個隨機數。 檢查這一行:

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

可能是完全隨機的。 所以我建議你描述一個更好的要求。 你想要一個與前一個不同的下一個號碼嗎? 你想在一個特殊的響鈴中最多重復嗎? 讓我們說連續6個數字,每個數字都允許發生兩次?

如果您提出這樣的要求,我們可能會幫助您。 否則我們可以說:你看到的是真的隨機:)

這是一個算法:

initialize an array A[4] with the numbers 1-4
set a counter Acnt, the effective size of A. Initialize to 4
for i in 1 to length(output sequence)
   choose a random integer X from 0 to Acnt -1
   save A[X] to your output sequence
   swap(A[X],A[Acnt - 1])
   Acnt--
   if(Acnt == 0) Acnt = lengh(A)

想象一下,A是一包數字為1-4的球。 循環的每次迭代,你移除一個球。 您可以簡單地將球隱藏在數組的末尾,而不是實際從數組中刪除。 當您減少球袋中的球數(Acnt)時,您選擇的下一個球來自非隱藏球。

如果您沒有更多球可供選擇,您可以通過將球袋中的球數重新設置為完全計數來取消隱藏球。

這基本上是標准的混洗算法。

編輯:重讀問題,我現在看到他只允許在1個數字后重復,而不是整個序列,在這種情況下,你需要做的就是修改這個是if(Acnt == 0)to if(Acnt == length (A) - 1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM