【问题标题】:Non Repeating Random Numbers Array Java, for/do/while loop非重复随机数数组 Java,for/do/while 循环
【发布时间】:2014-11-16 17:54:16
【问题描述】:

大家好,我正在处理的这个项目需要帮助,我想限制我使用 for 循环和 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]) 但它只检查前一个插槽。谢谢

【问题讨论】:

  • 我忘了补充一点,我正在尝试制作一个 1-100 的 10 数字非重复数组。
  • 执行此操作的正常方法是将值 1 到 100 并取前 10。即第一个是做一些完全不同的事情。你的随机数会做 2 - 100。
  • @Tom nextInt() 不是Math 方法,它在Random 类上,它是一个实例方法
  • @Tom: 99-1 是 98,而不是 100?为什么要 +1?
  • @drewmoore 对,我忽略了 Math :(.

标签: java for-loop random while-loop


【解决方案1】:

如果您只想解决您的主要问题以在11100 之间生成一系列10 不同数字,请使用Java 8,不要重新发明轮子 p>

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()]);

添加

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

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);
}

【讨论】:

  • 我认为 OP (NewbCoder1) 在这里需要一些解释(因为我也不明白,而且我已经编码了很长时间)
  • 我加了一些cmets来解释一下。
  • 对不起,我是编码新手,我想避免使用我不理解的东西,有没有与我目前所知道的相关的解决方案?
  • @Charlie 我如何解释一个 15 岁的程序员 coding for a long time? @NewbCoder1 是的,我会在一分钟内将其添加到我的答案中
  • @Chasmo Whew,我猜到现在大约 7 年了。我是伴随着 Java 长大的。我已经成功地在多线程服务器和客户端之间编写和运行我自己的(类 HTML)协议。
【解决方案2】:

对于 1-100 的 10 个数字非重复数组,我会使用 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));

编辑

根据您的 cmets,首先编写一个 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;
    }
}

【讨论】:

  • 感谢您的解决方案,但我在高中计算机科学课上,我对 LinkedHashSet 一无所知。我需要使用我所知道的解决方案。
  • @NewbCoder1 添加了一个使用数组(和辅助方法)的示例。下次,请告诉我们您问题中的所有要求。我们怎么知道你知道什么?
  • 您能否稍微编辑我的代码以获得解决方案,或者它是否效率低下且糟糕 XD。不过还是谢谢你的回答。
  • 您的代码没有按照您的要求执行,而且修复它需要的不仅仅是“轻微”编辑。
【解决方案3】:

如果您正在寻找一个数组,例如 1-100 的 10 个非重复数字,只需执行此操作即可。

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

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多