关于java抽奖的一个小程序,高手进来帮我看看啊~~~
解决时间 2021-07-25 19:56
- 提问者网友:箛茗
- 2021-07-25 10:01
如题,程序没有报错,运行时却抛出异常,现给出程序代码:
import java.util.*;
public class choujiang1
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.println("总共可以抽取多少个数字?");
int m=in.nextInt();
System.out.println("你想要抽取多少个数字?");
int n=in.nextInt();
int[] numbers=new int[n];
for(int i=0;i<numbers.length;i++)
numbers[i]=i+1;
int[] result=new int[m];
for(int i=0;i<result.length;i++)
{
int r=(int)(Math.random()*n); //得到随机数
result[i]=numbers[r]; //数组拷贝
numbers[r]=numbers[n-1]; //使数字不重复
n--;
}
Arrays.sort(result);
for(int r:result)
System.out.println(r);
}
}
运行后,在第三步时抛出异常的截图如下
为什么会这样啊?麻烦高手看一下啊!还有 for(int r:result)是什么意思啊,麻烦解释一下!
最佳答案
- 五星知识达人网友:夜风逐马
- 2021-07-25 10:23
给你分析下,你的错误原因,自己修改
n=20的情况
Math.random() 产生的随机数在0~1之间
Math.random()*n 那么随机数就是在0~20之间
int[] numbers=new int[n]; 而你声明的数组下标[0]~[19]
result[i]=numbers[r]; 所以当r=20就越界了,因为最大是19
明白了吗?????????
全部回答
- 1楼网友:有你哪都是故乡
- 2021-07-25 12:25
for (int r : result) 就是foreach
- 2楼网友:轻熟杀无赦
- 2021-07-25 12:20
你这里result比numbers可能长。遍历赋值的时候,就会出现下标越界。感觉是你那个数组拷贝那里的事
- 3楼网友:平生事
- 2021-07-25 11:11
import java.util.*;
public class choujiang1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("总共可以抽取多少个数字?");
int m = in.nextInt();
System.out.println("你想要抽取多少个数字?");
int n = in.nextInt();
int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++)//numbers数组里面存的是1到n.
numbers[i] = i + 1;
int[] result = new int[m]; //result为存放结果的数组;n为想要抽取的数字的个数,m为总数。
for (int i = 0; i < result.length; i++) {
int r = (int) (Math.random() * n); // 得到随机数
result[i] = numbers[r]; // 数组拷贝 //抽中numbers数组中的第r个!
numbers[r] = numbers[n - 1]; // 使数字不重复
n--; //
}
Arrays.sort(result); //对结果按照升序进行排序。
for (int r : result) //输出结果。
System.out.println(r);
}
我要举报
大家都在看
推荐资讯