簡體   English   中英

在java中生成隨機數對,使得p!= q

[英]generating pairs of random numbers in java such that p !=q

我試圖在[0,n)范圍內創建成對的隨機整數。 我需要確保對於任何輸入n ,創建的數字,比如p,q,使得p != q

我嘗試使用java.util.Randomseed sothat我可以重現結果..我嘗試輸入100,200,400,800並且他們都創建了p,q使得p !=q 。但是在1600兩對與p == q

public static void generate(int size){      
    Random ran = new Random();
    ran.setSeed(123456L);       
    for(int i =0;i<size;i++){
        int p = ran.nextInt(size);
        int q = ran.nextInt(size);
        if(p==q)
            System.out.println(p+" equals "+q);
        //else
            //System.out.println(p+" "+q);
    }
}

public static void main(String[] args) {
    generate(1600);

}

這給了

692 equals 692
843 equals 843

我確信有一些方法可以確保p!= q對於任何輸入n ..但我不記得所需的數學

有人可以幫忙嗎?

只要繼續挑選,直到它們不匹配。

int p = ran.nextInt(size);
int q;

do {
    q = ran.nextInt(size);
} while(p==q);

在[0,n)中生成一個數字,在[0,n-1]中生成另一個數字如果第二個數字優於(包括)第一個,則添加一個。

int p = ran.nextInt(size);
int q = ran.nextInt(size-1);

if (q>=p){
    q++;
}

List添加1 to n 然后使用Collection.Shuffle來整理整個list 它會以相同的可能性洗牌。 然后從列表中獲取任何2

例如

ArrayList a = new ArrayList();
for(int i = 1;i <= n; i++)
    a.add(i);
Collections.shuffle(a);
int first = (int)a.get(0);
int second = (int)a.get(1);

其中一個解決方案是:

  1. 生成第一個數字
  2. 生成第二個數字
  3. 第二個數字等於第一個數字返回第2步

幾乎100%的步驟2將執行不超過兩次。

但是確保n大於1,因為在另一種情況下你會有無限循環(但無論如何,你不能用任何算法得到正確的結果)

暫無
暫無

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

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