任务是:生成小于n的k个不同的正数而不重复。
我的方法如下。
首先创建k的数组大小,我们应该写下这些数字:
int a[] = new int[k];
//Now I am going to create another array where I check if (at given number
//position is 1 then generate number again, else put this number in an
//array and continue cycle.
我在这里放了一段代码和解释。
int a[]=new int[k];
int t[]=new int[n+1];
Random r=new Random();
for (int i==0;i<t.length;i++){
t[i]=0;//initialize it to zero
}
int m=0;//initialize it also
for (int i=0;i<a.length;i++){
m=r.nextInt(n);//random element between 0 and n
if (t[m]==1){
//I have problems with this. I want in case of duplication element
//occurs repeat this steps afain until there will be different number.
else{
t[m]=1;
x[i]=m;
}
}
所以我填写了我的问题:如果t [m] == 1。这意味着这个元素已经发生,所以我想 生成一个新数字,但问题是生成的数字的数量 不是k因为如果i == 0并且发生重复元素并且我们写继续那么它将在i == 1切换。 我需要像重复步骤那样转到。或者:
for (int i=0;i<x.length;i++){
loop:
m=r.nextInt(n);
if ( x[m]==1){
continue loop;
}
else{
x[m]=1;
a[i]=m;
continue; //Continue next step at i=1 and so on.
}
}
我需要用Java编写这段代码。
答案 0 :(得分:3)
您似乎需要一种随机抽样算法。您希望能够从集{0,1,2,3 ...,n-1}中选择m个随机项。
参见this post,我在那里写了5种有效的随机抽样算法。
以下是Floyd的实现,这在您的情况下非常有用:
private static Random rnd = new Random();
...
public static Set<Integer> randomSample(int n, int m){
HashSet<Integer> res = new HashSet<Integer>(m);
for(int i = n - m; i < n; i++){
int item = rnd.nextInt(i + 1);
if (res.contains(item))
res.add(i);
else
res.add(item);
}
return res;
}
答案 1 :(得分:-1)
Create an array arr with n elements (1..n);
for i=1 to k {
result[i] = arr[rand]
delete arr[result[1]]
}