非重复随机数数组Java,用于/ do / while循环

时间:2014-11-16 17:54:17

标签: java for-loop random while-loop

嘿伙计我需要帮助我正在进行的这个项目,我想限制我用来循环和do / while循环的东西。我已经做了一段时间,我仍然对我正在做的事情感到困惑。这是我到目前为止所拥有的。

public class Array2
{

public static void main(String[] args)
{
    int[] array1= new int[10];
    int x=0;
    int num=0;
    do
    {
        for(int i=0; i<array1.length; i++)
        {
            int j= 2 + (int)(Math.random() * (99-1));
            if(i==0)
            {
                array1[i]=j;
            }
            else
            {
                if(j==array1[i-1])
                {
                x++;

                }
                else
                    array1[i]=j;    
            }
            System.out.println(array1[i]);
            num++;

        }
    }while(x==0&&num<array1.length);


}

我知道这段代码不起作用,我正在寻找一个解决方案,这样当x设置为1时,它只是设置j等于不同的随机数,并再次检查它是否是重复数字。我也想知道如何检查j的重复数而不是if(j == array1 [i-1],因为它只检查前面的数组插槽。请帮忙!

编辑: 我现在的主要问题是如何检查j是否等于array1中的任何数字,现在我有if(j == array1 [i-1])但是只检查前一个槽。感谢

3 个答案:

答案 0 :(得分:3)

如果您只是想解决主要问题以在101之间生成一系列100个不同的数字,请使用Java 8并且不要&# 39;重新发明轮子

final Collection<Integer> intList = IntStream.rangeClosed(1, 100) // generate an infinite list of numbers between 1 and 100
    .distinct() // avoid duplicates in that list
    .limit(10) // take only 10 numbers from that list
    .boxed() // cast them to Integer
    .collect(Collectors.toList()); // collect them in a Collection<Integer>

如果它仍然是一个数组,那么添加以下行:

Integer[] intArray = intList.toArray(new Integer[intList.size()]);

<强> ADDITION

如果你想要一个解决方案,它不像上面的例子那么简单,但可能更容易掌握,请考虑一下:

1:只需生成一个数字为1到100的列表,所以每个数字只有一次。

final List<Integer> baseIntegers = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
  baseIntegers.add(i + 1); // to get 1 to 100
}

你应该做的第二件事就是洗牌,这样你就得到了随机的订单。

Collections.shuffle(baseIntegers);

最后一步是在你的情况10中只需要你需要的元素数量:

final int numbersToExtract = 10;
final int[] finalArray = new int[numbersToExtract];
for (int i = 0; i < numbersToExtract; i++) {
  finalArray[i] = baseIntegers.get(i);
}

答案 1 :(得分:1)

对于10个非重复数字1-100的数字,我会使用Random.nextInt(int)LinkedHashSet(因为它保留了插入顺序并防止重复)等等,

int[] arr = new int[10];
Random rand = new Random();
Set<Integer> set = new LinkedHashSet<>();
while (set.size() < arr.length) {
    set.add(rand.nextInt(100) + 1);
}
// Copy the Set to the array.
int pos = 0;
for (Integer v : set) {
    arr[pos++] = v;
}
System.out.println(Arrays.toString(arr));

修改

根据您的评论,首先编写一个contains方法,将数组从左侧循环到右侧的给定索引,查找类似

的值
private static boolean contains(int[] arr, int v, int pos) {
    for (int i = 0; i < pos; i++) {
        if (arr[i] == v) {
            return true;
        }
    }
    return false;
}

然后使用它确保在数组调用contains中不再输入一次相同的值,如

int[] arr = new int[10];
Random rand = new Random();
int pos = 0;
while (pos < arr.length) {
    int val = rand.nextInt(100) + 1;
    if (!contains(arr, val, pos)) {
        arr[pos++] = val;
    }
}

答案 2 :(得分:0)

如果你正在寻找一个数组,比如1-100中的10个非重复数字就行了。

  1. 使用100个元素创建ArrayList。 elmt [0] = 1,elmt [1] = 2等
  2. 创建一个有10 elmnta空间的常规数组,例如。 regArray [10]
  3. 使用random#generator生成0-99之间的数字。使用随机#并将其与ArryList条目匹配。因此,如果得到67,那将代表现实生活中的#34; 68(elmt [67] = 68)。把它放在RegArray [0]。
  4. 从阵列列表数组中删除elmt [67]。
  5. 从0-98获取随机数。像以前一样使用那个rnd号并放入RegArray [1]。从ArrayList中删除elmt。告诉你这个shiznt直到你得到10个随机数