[英]generating pairs of random numbers in java such that p !=q
我试图在[0,n)
范围内创建成对的随机整数。 我需要确保对于任何输入n
,创建的数字,比如p,q,使得p != q
我尝试使用java.util.Random
和seed
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);
其中一个解决方案是:
几乎100%的步骤2将执行不超过两次。
但是确保n大于1,因为在另一种情况下你会有无限循环(但无论如何,你不能用任何算法得到正确的结果)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.