Java 这是怎么变得不再重复的?
我想把这个改成唯一的号码,不重复…怎么做? 请给我一些建议,以改变这个代码的问题。。。 我需要20个唯一的号码,我需要让他们成为唯一的,没有重复在同一行。。。 这是老师给我的问题:Java 这是怎么变得不再重复的?,java,arrays,Java,Arrays,我想把这个改成唯一的号码,不重复…怎么做? 请给我一些建议,以改变这个代码的问题。。。 我需要20个唯一的号码,我需要让他们成为唯一的,没有重复在同一行。。。 这是老师给我的问题: import java.lang.*; // import java.util.Random; class UniqueRandomIntArray { // static Random rnGen = new Random(); private static void uriArray(int[]
import java.lang.*;
// import java.util.Random;
class UniqueRandomIntArray {
// static Random rnGen = new Random();
private static void uriArray(int[] rray) {
int low = 0;
int high = 50;
int rn;
int haveit = 0;
int i = 0;
int j;
while((haveit == 0) && i < rray.length) {
rn = randNum(low, high);
for(j = 0; j <= i; j++) {
if(rn == rray[j]) {
haveit = j;
j = i;
}
}
if(haveit != 0) {
System.out.println("a[" + haveit + "] is " + rn + " already");
haveit = 0;
}
else {
System.out.println("a[" + i + "] is " + rn);
rray[i] = rn;
i++;
}
} // end while
} // end uriArray
private static int randNum(int min, int max) {
int range = (max - min) + 1;
// int randnum = rnGen.nextInt(range) + min;
int randnum = (int) (Math.random() * range) + min;
return randnum;
}
public static void main(String[] args) {
int[] arra = new int[20];
uriArray(arra);
for(int i=0; i<arra.length; i++) {
System.out.print(" | " + arra[i]);
}
System.out.println(" | ");
}
} //class ends
一个简单的方法是使用Collections.shuffle
Radnom不能保证唯一性 在我看来,你可以做两件事: 建议一: 生成20个不同的间隔 从每个间隔中取一个随机数 由于间隔不重叠,因此您的数字是随机且唯一的 使用集合。使用数字对集合进行洗牌 建议二: 迭代某个时间间隔 定义接受概率 调用Math.random并查看您的值是否高于或等于此概率 如果是,则将数字添加到数组中,否则跳过 当你有20个号码时停止 使用集合。使用数字对集合进行洗牌
您的问题的一个更简单的解决方案是使用一个集合来存储随机数,并在[0,50]范围内不断向该集合添加新的随机数,直到有20个为止:
public static int[] getRandNums() {
Set<Integer> randNums = new HashSet<Integer>();
Random randomGenerator = new Random();
do {
int randomInt = randomGenerator.nextInt(50); // generate random number between
randNums.add(randomInt); // 0 and 50
if (randNums.size() == 20) break; // exit the loop at 20 numbers
} while(true);
Integer[] resultInt = randNums.toArray(new Integer[0]);
int[] result = new int[resultInt.length];
for (int ctr=0; ctr < resultInt.length; ++ctr) {
result[ctr] = resultInt[ctr].intValue();
}
return result; // return numbers as an array
}
用法:
我选择不严格遵守您的原始代码,因为它很凌乱。您的代码几乎可以正常工作,但您可以使用数组中的第一个值创建一个副本 你的问题是,你用0来检查你没有那个号码,所以,如果你已经在索引0上有这个号码,你会认为你没有这个号码。您可以使用-1而不是0: 改变 到 改变 到
创建包含每个候选编号的列表。用来洗牌。将前20个元素复制到结果数组。的默认haveit值为-1,而不是0。因为0可能是haveit的有效值。我应该把它放在哪里?所以我需要像你一样设置新数组?我不知道你在问什么。如何对重复的数字进行排序?请检查下面的答案,如果它解决了你的问题,请标记一个正确的答案。
public static int[] getRandNums() {
Set<Integer> randNums = new HashSet<Integer>();
Random randomGenerator = new Random();
do {
int randomInt = randomGenerator.nextInt(50); // generate random number between
randNums.add(randomInt); // 0 and 50
if (randNums.size() == 20) break; // exit the loop at 20 numbers
} while(true);
Integer[] resultInt = randNums.toArray(new Integer[0]);
int[] result = new int[resultInt.length];
for (int ctr=0; ctr < resultInt.length; ++ctr) {
result[ctr] = resultInt[ctr].intValue();
}
return result; // return numbers as an array
}
public static void main(String[] args) {
int[] array = getRandNums();
for (int i=0; i< array.length; ++i) {
System.out.print(" | " + arra[i]);
}
System.out.println(" | ");
}
int haveit = 0;
int haveit = -1;
while ((haveit == 0) && i < rray.length) {
while ((haveit == -1) && i < rray.length) {
if(haveit != 0) {
System.out.println("a[" + haveit + "] is " + rn + " already");
haveit = 0;
}
if(haveit != -1) {
System.out.println("a[" + haveit + "] is " + rn + " already");
haveit = -1;
}