黑马程序员技术交流社区
标题:
数组排序值代码疑问
[打印本页]
作者:
严露华
时间:
2013-4-15 23:05
标题:
数组排序值代码疑问
本帖最后由 严露华 于 2013-4-16 07:42 编辑
//需求:从50个元素中取出6个数,且不重复
import java.util.*;
public class LotterDrawing {
public static void main(String[] args) {
int n = 50;
int [] number = new int[n];
for(int i=0;i<number.length;i++)
{
number[i] = i+1;
}
int[] result = new int[6]; //用来存放抽取的数组
for(int i=0;i<result.length;i++)
{
int r = (int)(Math.random()*50); //得到0到49这之间的一个随机数
result[i] = number[r];
number[r] = number[n-1]; //疑问????
n--; //疑问???
}
Arrays.sort(result);
for(int r :result){
System.out.println(r);
}
}
}
复制代码
问题:答案说因为所有抽取的数值必须不相同,因此这里用数组中的最后一个数值改写number[r],并将减1.
我的疑问:为什么使用数组中最后一个数值来改写number[r]?若在n=50,那么number[r] = 50;那也并未改写number[r]的值。只是将最后一个值赋给了number[r]。求解答?
作者:
PANZERLEADER
时间:
2013-4-16 00:19
public class RandomNumber {
public static void main(String[] args) {
System.out.println("How many numbers do you need to draw?");
int k = 6;
System.out.println("What is the highest number you can draw?");
int n = 50;
// fill an array with numbers 1 2 3. . . n
int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i + 1;
}
// draw k numbers and put them into a second array
int[] result = new int[k];
for (int i = 0; i < result.length; i++) {
// make a random index between 0 and n - 1
int r = (int) (Math.random() * n); // 关键在这里,*n表示每次会产生随机数的范围,每次产生的随机数范围是0~n
// pick the element at the random location
result[i] = numbers[r];
// move the last element into the random location
numbers[r] = numbers[n - 1];
// 之所以这里把最后的元素和之前选择元素做替换,因为要把每次都会缩小随机数产生的范围,而范围缩小是通过最后一个数减小来实现的。
n--;
}
// print the sorted array
Arrays.sort(result);
System.out
.println("Bet the following combination,It'll make you rich!");
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
}
}
复制代码
在网上找了下,发现楼主你的代码没贴全呀。
我把源码贴过来了,你那个之所以不行,就是在于,你把源码中的变量n(控制随机数范围的变量)弄成了常量,如果这样做的话,每次随机数产生的范围都是一样大的,交换最后一个元素位置根本没意义。
如果像是源码那样,通过n的每次减小来缩小随机数产生的范围,通过交换最后一个数,可以把之前选择过的数剔除出随机数的范围,从而实现不重复。
作者:
严露华
时间:
2013-4-16 07:07
PANZERLEADER 发表于 2013-4-16 00:19
在网上找了下,发现楼主你的代码没贴全呀。
我把源码贴过来了,你那个之所以不行,就是在于,你把源码中的 ...
源码不是贴过来的,在一本书上看到的,看了半天没弄明白,所以就来请教了,代码经过了一些简化,在书上只是提供了数组排序的例子,并未仔细说清楚n的值,导致在在产生随机数的时候就用n表示,也就一直在想n到底是常量还是变量呢,也导致了后面想不清楚,经过你的提醒才清楚n的值了一以及后面代码的意思。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2