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]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 = sortArray[k]) temp ++ ;
				System.out.print(sortArray[k]);
				// 第二层循环 与前i个已经排序好的数组进行
			if(tempk; 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 


你可能感兴趣的:(java学习心得)