4

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

我尝试使用java.util.Randomwith以便seed我可以重现结果..我尝试了输入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 .. 但我不记得所需的数学

有人可以帮忙吗?

4

4 回答 4

6

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

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

do {
    q = ran.nextInt(size);
} while(p==q);
于 2013-06-24T13:42:40.297 回答
4

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

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

if (q>=p){
    q++;
}
于 2013-06-24T13:45:33.037 回答
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);
于 2013-06-24T13:41:47.103 回答
1

解决方案之一是:

  1. 生成第一个数字
  2. 生成第二个号码
  3. 当第二个数字等于第一个数字时,返回步骤 2

在几乎 100% 的情况下,第 2 步将执行不超过几次。

但是要确保 n 大于 1,因为在另一种情况下您将有一个无限循环(但无论如何,您无法使用任何算法获得正确的结果)

于 2013-06-24T13:43:41.487 回答