java 生成一组不重复的随机数
2016-01-18 21:10
597 查看
引出这个问题的是,是我在学习设计拼图游戏中出现的,拼图游戏开始的时候,图是散乱的,比如拼图游戏被分成了8*4 共32块,那么32块图对应着32个数,而若要使每次开始前的排列顺序不一致,就需要产生32个随机数。看过别人的方法,大郅的思想是0到32之间产生32个不同的随机数,所以创建了一个长度为32的Boolean数组用于存放产生的数字是否已经出现过,如果出现过,while循环会一直继续下去直到产生一个从未出现过的数字。而这种方法所要产生随机数的个数是不能保障的,最小可能产生32次随机数即可,也有可能产生无穷次随机数,仍不能满足要求。倘若需要生成数十万个随机数,那么这种方法显然需要耗费大量的计算时间。
因此我的解法是:共生成n次随机数,这里n就是32啦。利用java自带的Random函数,调用random.nextInt(m),即可生成0至m-1之间的随机数。第一次生成0至32之间的随机数,第二次生成0-31之间的随机数,依次类推。若生成的随机数已经出现过了,可做以下处理:将已经生成好的前i个随机数排序,并将当前生成的随机数与排序好的随机数组逐次比较,如果该生成的随机数大于等于排序好的数组元素,则随机数加一。这样做的目的就是将随机数插入到已经生成好的随机数组中。该解法的思想类似于排队插队问题。package main; import java.util.Random; public class main { public static void main(String[] args){ //JFrameGame jframe = new JFrameGame(new JPanelGame()); /*int numArray[] ={1,5,6,2,4,3}; int sortArray[] =new int[6]; sortArray[0] = numArray[0]; for(int i = 0 ;i <6 ; i++){ //最外层循环,对待排序数组进行全部遍历 for(int k =0 ; k<=i ; k++){ // 第二层循环 与前i个已经排序好的数组进行 if(numArray[i]<sortArray[k]){ //如果待排序数组比 已经排序好的数组第k个元素小 for(int m = i ; m >k; m--) {//则对从 k个元素以后排好的数组后移一个 sortArray[m]=sortArray[m-1]; } sortArray[k]=numArray[i]; break; }else if(k==i){ sortArray[i]=numArray[i]; } System.out.print(sortArray[k]); } System.out.println(); } for(int k =0 ;k <6; k ++) System.out.print(sortArray[k]+"..."); */ Random random = new Random() ; int cnt = 6 ; boolean[] isShown = new boolean[cnt]; int[] numArray = new int[cnt]; int[] sortArray = new int[cnt]; for(int i = 0 ; i <cnt ; i++){ int temp = random.nextInt(cnt-i); System.out.println("生成的随机数 : "+temp+":"); if(i == 0) sortArray[i] = temp ; for(int k =0 ; k<=i ; k++){ if(temp >= sortArray[k]) temp ++ ; System.out.print(sortArray[k]); // 第二层循环 与前i个已经排序好的数组进行 if(temp<sortArray[k]){ //如果待排序数组比 已经排序好的数组第k个元素小 for(int m = i ; m >k; m--) {//则对从 k个元素以后排好的数组后移一个 sortArray[m]=sortArray[m-1]; } sortArray[k]=temp; break; }else if(k==i){ sortArray[i]=temp; } } System.out.println(); numArray[i] = temp ; } for(int i = 0 ; i <cnt ; i ++){ System.out.println("cnt "+i+":" +numArray[i]); } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树