如何多次生成随机数并查找其在指定数组中的位置?
问题分析与解决方案
咱们先拆解下你遇到的问题:当把随机数k的生成逻辑放进循环重复执行时,在if (arr[i] == k)处报错,大概率是数组索引越界或者类型匹配的隐含隐患导致的,咱们一步步来梳理解决:
核心问题排查
- 数组索引越界的坑:你原来的代码里,第一次查找后
i的值会停在找到的位置或者数组末尾。如果把k的生成放进循环后,没有每次重置i为0,那么下一次循环时i已经等于arr.length(也就是1000000),此时访问arr[i]就会抛出ArrayIndexOutOfBoundsException——这是最常见的触发报错的原因。 - 类型不匹配的隐患:你的
k是double类型,而数组元素是int类型。虽然你用了(int)(Math.random()*1000001)把随机数转成整数再转成double,比较时arr[i]会自动转成double看似没问题,但如果后续代码改动(比如去掉外层的(int)),就会出现精度问题,更规范的做法是把k直接定义为int类型。
修正后的完整代码
public class Feld { public static void main(String[] args) { int n = 1000001; // 要存0-1000000,数组长度得设为1000001 int arr[] = new int[n]; // 填充0到1000000的数值 for(int i = 0; i < n; i++){ arr[i] = i; } // 指定重复查找的次数,比如测试10次 int repeatTimes = 10; for(int round = 0; round < repeatTimes; round++){ // 直接生成int类型的随机数,范围0-1000000 int k = (int)(Math.random() * 1000001); boolean found = false; int i = 0; // 每次循环必须重置i为0! while (i < arr.length) { if (arr[i] == k) { found = true; break; } i++; } // 输出位置:数组索引从0开始,所以实际位置是i+1 if (found) { System.out.println("随机数" + k + "的位置是:" + (i + 1)); } else { System.out.println("随机数" + k + "未找到,输出:" + (arr.length + 1)); } } } }
关键改动说明
- 调整数组长度:原代码数组长度是1000000,只能存0到999999,不符合你“填充0-1000000”的需求,所以改成
n=1000001。 - 每次循环重置索引i:在每次生成新的
k后,必须把i重新设为0,否则会从上次结束的位置继续遍历,直接触发索引越界。 - 统一类型为int:把
k改成int类型,避免double和int比较的潜在问题,代码逻辑更清晰。 - 增加循环次数控制:用
repeatTimes指定重复查找的次数,方便你灵活调整测试次数。
额外优化建议
因为你的数组是有序的连续整数,完全可以不用遍历查找,直接通过k的值计算位置,效率会高很多:
// 替代while循环的优化写法 if(k >=0 && k <=1000000){ System.out.println("随机数" + k + "的位置是:" + (k + 1)); }else{ System.out.println("随机数" + k + "未找到,输出:" + (arr.length + 1)); }
内容的提问来源于stack exchange,提问作者M. Eichhorn
相关产品推荐
相关产品推荐

