新手学习JAVA核心技术时的一个小问题

icywater100 2014-11-23 07:13:43
第八版80页:
作者的意思是一个1-100的数组a【】,然后不重复的从中挑出10个数放入result数组(比如)
他每次从随机产生一个0-99的下标index, 然后把这个下标对应的书放入result数组中。
在处理不重复的问题是:他用a[index]=a[n-1] (n是a数组的长度100),就是用数组的最后一个数替代被选中的数
这样怎么能做到不重复呢?
我用长度10的数组抽8个数 结果就重复了?

谢谢!
...全文
278 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
icywater100 2014-11-24
  • 打赏
  • 举报
回复
引用 3 楼 cocoa_cactus 的回复:
代码如下:

import java.util.*;
public class LotteryDrawing{
	public static void main(String[] args){
		// 按照你的例子 原数组长度:10, 彩票数组长度:8
		// [注意1]:此时原数组长度值等于原数组的真正长度
		int 原数组长度值 = 10,k = 8;

		int[] src = new int[原数组长度值];
		for(int i=0; i<原数组长度值; i++){
			src[i] = i+1; //[注意4]:每个下标对应的数都是唯一的
		}

		int[] result = new int[k];
		for(int i=0; i<k; i++){
			int index = (int)(Math.random() * 原数组长度值); // [注意3]:看完[注意2]再回看这条语句
			result[i] = src[index];
			src[index] = src[原数组长度值-1];
			原数组长度值--;// [注意2]:此时原数组长度值小于原数组的真正长度
							// 也就是下一次循环时[注意3]的"原数组长度值"已经小于真实长度了
							// 所以[注意3]生成的下标一直在变小,后面的下标取不到因此避免重复
		}
		Arrays.sort(result); //易于查重
		System.out.println(Arrays.toString(result));
	}
}
比二楼又进了一步 谢谢
icywater100 2014-11-24
  • 打赏
  • 举报
回复
引用 1 楼 rumlee 的回复:
假如我有一个10个数的数组,1 2 3 4 5 6 7 8 9 10,第一次我取一个10以内的随机数,例如取到的是3,则把3写入result数组,并且将源数组3和10对调一下,则原数组变成了1 2 10 4 5 6 7 8 9 3,接着我取一个9以内的随机数,这样不管取到的是几,我只能取前面9个数中的一个,3是第10个,肯定取不到,接着取8以内的随机数,依次类推,永远都取不到重复的。 不知道你又没有明白我的意思。
了解 解释的很清楚 谢谢
_reason 2014-11-23
  • 打赏
  • 举报
回复
代码如下:

import java.util.*;
public class LotteryDrawing{
	public static void main(String[] args){
		// 按照你的例子 原数组长度:10, 彩票数组长度:8
		// [注意1]:此时原数组长度值等于原数组的真正长度
		int 原数组长度值 = 10,k = 8;

		int[] src = new int[原数组长度值];
		for(int i=0; i<原数组长度值; i++){
			src[i] = i+1; //[注意4]:每个下标对应的数都是唯一的
		}

		int[] result = new int[k];
		for(int i=0; i<k; i++){
			int index = (int)(Math.random() * 原数组长度值); // [注意3]:看完[注意2]再回看这条语句
			result[i] = src[index];
			src[index] = src[原数组长度值-1];
			原数组长度值--;// [注意2]:此时原数组长度值小于原数组的真正长度
							// 也就是下一次循环时[注意3]的"原数组长度值"已经小于真实长度了
							// 所以[注意3]生成的下标一直在变小,后面的下标取不到因此避免重复
		}
		Arrays.sort(result); //易于查重
		System.out.println(Arrays.toString(result));
	}
}
wyc_ 2014-11-23
  • 打赏
  • 举报
回复
a[index]=a[n-1] (n是a数组的长度100) 楼主看一下这个n是不是变化的,n不变没法去重。楼上说的是一种方法,可以实现你说的效果。
rumlee 2014-11-23
  • 打赏
  • 举报
回复
假如我有一个10个数的数组,1 2 3 4 5 6 7 8 9 10,第一次我取一个10以内的随机数,例如取到的是3,则把3写入result数组,并且将源数组3和10对调一下,则原数组变成了1 2 10 4 5 6 7 8 9 3,接着我取一个9以内的随机数,这样不管取到的是几,我只能取前面9个数中的一个,3是第10个,肯定取不到,接着取8以内的随机数,依次类推,永远都取不到重复的。 不知道你又没有明白我的意思。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧