java 生成一组不重复的随机数

引出这个问题的是,是我在学习设计拼图游戏中出现的,拼图游戏开始的时候,图是散乱的,比如拼图游戏被分成了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]);
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值