在java中生成随机数对,使得p!= q

时间:2013-06-24 13:39:48

标签: java random

我正在尝试在[0,n)范围内创建一对随机整数。 我需要确保对于任何输入n,创建的数字(例如p,q)都是p != q

我尝试将java.util.Randomseed一起使用,我可以重现结果。我尝试了输入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 ..但我不记得所需的数学

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:6)

继续挑选,直到它们不匹配。

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

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

答案 1 :(得分:4)

在[0,n)中生成一个数字,在[0,n-1]中生成另一个数字 如果第二个优先(包括)到第一个,则添加一个。

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

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

答案 2 :(得分:1)

1 to n中添加List。然后使用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);

答案 3 :(得分:1)

其中一个解决方案是:

  1. 生成第一个号码
  2. 生成第二个号码
  3. 第二个数字等于第一个数字返回第2步
  4. 几乎100%的步骤2将执行不超过两次。

    但是确保n大于1,因为在另一种情况下你会有无限循环(但无论如何,你不能用任何算法得到正确的结果)