Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I';我从java程序中得到奇怪的输出_Java_Random - Fatal编程技术网

I';我从java程序中得到奇怪的输出

I';我从java程序中得到奇怪的输出,java,random,Java,Random,我这里有些奇怪的情况,我想你可以帮助我。我有一个整数数组,里面填充了从1到10的数字。我想从这个数组中生成随机数,并将它保存到另一个int数组中。我使用类Random来选择任何数字,因为Random抛出0,所以我也这样修改它(所以它抛出1到10的数字) 下面的代码确保,若它生成相同的随机数,它将跳过它。这个程序正在运行,我得到了另一个随机排列的数字,从1到10。这就是我想要的。但有时我从1-10中漏掉了一个数字,而我却得到了零。为什么 int[] numbers = {1,2,3,4,5,6,7

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

下面的代码确保,若它生成相同的随机数,它将跳过它。这个程序正在运行,我得到了另一个随机排列的数字,从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]);
}
int[]数字={1,2,3,4,5,6,7,8,9,10};
int[]usednum=新int[10];
Random rand=新的Random();
int-randNum;
int min=1;

对于(int x=0;xEdit),遵循它并重新写入:

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); 
        }
List number=newlinkedlist(Arrays.asList(新整数[]{1,2,3,4,5,6,7,8,9,10}));
int[]usednum=新int[10];
Random rand=新的Random();
int n=numbers.size();
对于(int i=0;i
编辑-跟随并重新编写:

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); 
        }
List number=newlinkedlist(Arrays.asList(新整数[]{1,2,3,4,5,6,7,8,9,10}));
int[]usednum=新int[10];
Random rand=新的Random();
int n=numbers.size();
对于(int i=0;i
您在整个过程中生成已用数字,所以它不会生成零,只是无法生成它应该生成的值。

您在整个过程中生成已用数字,所以它不会生成零,只是无法生成它应该生成的值。

如果您的目标只是对一个数字数组进行无序排列,请尝试以下操作:n标题:

Integer[] numbers = {1,2,3,4,5,6,7,8,9,10};
Collections.shuffle(Arrays.asList(numbers));
除非你正在完成一项家庭作业,迫使你以更为手动的方式解决这个问题,否则就使用标准的Java库


由于
数组返回了特殊类型的
列表
。asList(…)
。请注意,您必须使用
整数
数组而不是
int
,因此
shuffle
方法将更改写入底层的
整数
数组.

如果您的目标只是洗牌一组数字,请尝试以下方法:

Integer[] numbers = {1,2,3,4,5,6,7,8,9,10};
Collections.shuffle(Arrays.asList(numbers));
除非你正在完成一项家庭作业,迫使你以更为手动的方式解决这个问题,否则就使用标准的Java库


由于
数组返回了特殊类型的
列表
。asList(…)
。请注意,您必须使用
整数
数组而不是
int
,因此
shuffle
方法将更改写入底层的
整数
数组.

您是最内部的
for
循环仅检查当前随机数是否在
usednum[]
数组。而紧靠该数组外部的
for
循环只检查总数的10倍。它放弃得太快,因为它只尝试10个随机数。如果所有10个都已使用,则在
usednum[]
的插槽中将不会存储任何内容(因此它将是0),尝试添加一个
,而
则围绕该循环循环,并摆脱与之无关的最外层
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;
                 }
              }
           }
        }

for(int i=0;i您是最内部的
for
循环仅检查当前随机数是否在
usednum[]
数组。而紧靠该数组外部的
for
循环只检查总数的10倍。它放弃得太快,因为它只尝试10个随机数。如果所有10个都已使用,则在
usednum[]
的插槽中将不会存储任何内容(因此它将是0),尝试添加一个
,而
则围绕该循环循环,并摆脱与之无关的最外层
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;
                 }
              }
           }
        }

for(inti=0;i你有一个for循环太多了

使用i迭代器删除循环,程序将执行您想要的操作


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

你有一个for循环太多了

使用i迭代器删除循环,程序将执行您想要的操作


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

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

if(usednum[f] == randNum)

在所有迭代过程中,以相同的值
x
x
增量执行此操作,您就有机会更改零值。

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

if(usednum[f] == randNum)

在所有迭代过程中,如果使用相同的值
x
x
递增,则有机会更改零值。

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

请描述为什么您的代码不起作用,但没有解决此问题。我想您会希望将代码更改为以下内容:

    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]);
    }
int[]数字={1,2,3,4,5,6,7,8,9,10};
int[]usednum=新int[10];
Random rand=新的Random();
int selectedCount=0;
while(selectedCount