黑马程序员技术交流社区
标题:
基础班学习:随机打印该已知数组中的三个数
[打印本页]
作者:
duguwen
时间:
2017-3-28 11:08
标题:
基础班学习:随机打印该已知数组中的三个数
还没有学到集合,考虑到拿出的三个数不重复的情况,随手做的,应该能达到要求,但就是感觉不简洁。
思路:每拿到已知数组里的一个随机数,就将其他数放到一个新生成的长度为arr.length-1数组中,三次提取分别在三个不同的数组中,得到结果。
Random ran = new Random();
int[] arr = {12, 3, 21, 45, 28, 16, 7, 36, 90, 11};
int[] arr1 = new int[arr.length-1];
int[] arr2 = new int[arr1.length-1];
int a = ran.nextInt(arr.length);
for(int i=0,j=0;i<arr1.length;i++){
if(i==a)
continue;
arr1[j] = arr[i];
j++;
}
int b = ran.nextInt(arr1.length);
for(int i=0,j=0;i<arr2.length;i++){
if(i==a)
continue;
arr2[j] = arr1[i];
j++;
}
int c = ran.nextInt(arr2.length);
System.out.println(arr[a]+","+arr1[b]+","+arr2[c]);
作者:
hailong5214
时间:
2017-3-28 11:36
随机生成3个不同的数,在0-length之间 的,然后索引找值就可以了,怎么看你的这么麻烦
作者:
duguwen
时间:
2017-3-28 19:05
数组长度不能改变,但可以在 随机抽取的数组角标上做文章:
* 每次抽取一个数,可抽取的角标数-1
* 数组最后的元素值再赋给被抽取到的元素角标上
* 随机生成 1-(n-1-1)的随机数即要抽取的数组元素角标
* 参考资料:java核心技术卷1 P83
int[] array = {12, 3, 21, 45, 28, 16, 7, 36, 90, 11};
int[] result = new int[3];
int n = array.length;
for(int i = 0 ; i < result.length ; i++){
int d = (int) (Math.random()*n);
result[i] = array[d];
array[d] = array[n-1];
n --;
}
Arrays.sort(result);
for (int i : result) {
System.out.println(i);
}
作者:
duguwen
时间:
2017-3-28 19:06
hailong5214 发表于 2017-3-28 11:36
随机生成3个不同的数,在0-length之间 的,然后索引找值就可以了,怎么看你的这么麻烦 ...
随机生成的角标可能是重复的
作者:
可可心bug
时间:
2017-4-1 12:34
菜鸟加油 鼓励下 希望你也能关注我
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2