0

我这里有一些奇怪的情况,我想你可以帮助我。我有一个 int 数组,其中填充了从 1 到 10 的数字。我想从这个数组中生成随机数并将其保存到另一个 int 数组中。我使用 Random 类来选择任何数字,因为随机抛出 0 我也像这样修改它(所以它抛出从 1 到 10 的数字)

randNum = rand.nextInt(numbers.length-min+1)+min;   

以下代码确保如果它生成相同的随机数,它会跳过它。程序实际上正在运行,我正在另一个数组中随机放置从 1 到 10 的数字。这就是我想要的。但有时我会错过 1 - 10 之间的一个数字,而我会得到零。为什么??

int[] numbers = {1,2,3,4,5,6,7,8,9,10};
int[] usednum = new int[10];
Random rand = new Random();
int randNum;
int min = 1;

for (int x = 0; x<numbers.length; x++) {        
  for (int i = 0; i<usednum.length; i++) { 
    randNum = rand.nextInt(numbers.length-min+1) + min;
    for (int f = 0; f<usednum.length; f++) {
      if (usednum[f] == randNum) {
        break;
      } else if (usednum[f] == 0) { 
        usednum[x] = randNum;   
      }
    }
  } 
}

for (int c = 0; c<usednum.length; c++) {
  System.out.println(usednum[c]);
}
4

7 回答 7

2

如果您的目标只是打乱一组数字,请尝试以下操作:

Integer[] numbers = {1,2,3,4,5,6,7,8,9,10};
Collections.shuffle(Arrays.asList(numbers));

它会产生同样的效果。除非您完成的家庭作业迫使您以更手动的方式解决问题,否则请使用标准 Java 库。

由于返回的特殊类型,该shuffle方法将更改写入底层Integer数组。请注意,您必须使用not数组(请参阅为什么 Collections.shuffle() 对我的数组失败?)。ListArrays.asList(...)Integerint

于 2012-08-31T14:19:21.930 回答
2

您是最内层的for循环仅检查当前随机数是否在usednum[]数组中。并且for紧接其外的循环仅检查10 次 total。它放弃得太快了,因为它只尝试 10 个随机数。如果所有 10 个都已使用,则不会将任何内容存储在该插槽中usednum[](因此它将是0),尝试while在其周围添加一个循环并摆脱无关的最外层for循环:

        for(int i = 0; i<usednum.length; i++) {
           while(usednum[i]==0) {
              randNum = rand.nextInt(numbers.length-min+1)+min;
              for(int f = 0; f<usednum.length; f++) {
                 if(usednum[f] == randNum) {
                    break;
                 } //if                                                                                                                                        
                 else if (usednum[f] == 0) {
                    usednum[i] = randNum;
                 }
              }
           }
        }

另请注意,分配是针对usednum[i] = randNum;.

这实质上是用 while 循环替换中间for循环(从 i=0 到 9 的循环)。

于 2012-08-31T14:22:52.693 回答
0

编辑 - 跟随它并重写它:

List<Integer> numbers = new LinkedList<Integer>(Arrays.asList(new Integer[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }));
        int[] usednum = new int[10];
        Random rand = new Random();
        int n = numbers.size();
        for (int i = 0; i < n; i++) {
            int randNum = rand.nextInt(numbers.size());
            usednum[i]=numbers.get(randNum);
            numbers.remove(randNum);
        }
        for (int c:usednum) {
            System.out.println(c); 
        }
于 2012-08-31T14:13:38.160 回答
0

您正在通过整个过程生成使用的数字,因此它不会生成零,只是无法生成应有的值。

于 2012-08-31T14:17:52.177 回答
0

你有一个 for 循环太多。

用 i 迭代器删除循环,程序应该做你想做的事。

哦,从随机生成器中删除 -min+1,-1+1=0

于 2012-08-31T14:23:13.487 回答
0

您的数组usednum在开头由零组成。在某些情况下,您的程序不会更改该初始值,但会在该行之前中断:

if(usednum[f] == randNum)

并在具有相同值的所有迭代中做到这一点xX增量,您就有机会更改零值。

于 2012-08-31T14:25:26.697 回答
0

实际上,您从不使用数组的内容numbers。尝试将数组更改为int[] numbers = { 10, 22, 23, 42, 53, 18, 7, 8, 93, 10 };. 你会得到类似的输出。

Jon Lin 的回答描述了为什么您的代码不起作用但没有解决这个问题。我认为您会希望将代码更改为:

    int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int[] usednum = new int[10];
    Random rand = new Random();

    int selectedCount = 0;

    while (selectedCount < numbers.length) {
        int randNum = numbers[rand.nextInt(numbers.length)];
        boolean contains = false;
        for (int x = 0; x < selectedCount; x++) {
            if (usednum[x] == randNum) {
                contains = true;
                break;
            }
        }

        if (!contains) {
            usednum[selectedCount] = randNum;
            selectedCount++;
        }
    }


    for (int c = 0; c < usednum.length; c++) {
        System.out.println(usednum[c]);
    }
于 2012-08-31T14:29:05.827 回答