关于如何产生一组互不相同的随机数的算法

我们都知道如何产生一个随机数,但是我们是否能够产生一组互不相同的随机数呢?

这个方法的掌握对我们来说是十分重要的,我们都面对过随机分组的问题。当我们不知道该去如何随机分组时,我们可以编辑

一个程序来实现人员的随机安排。

这就要求我们产生一组互不相同的随机数,因为我们要以随机数的下标作为区分人员的标志。

闲话少说,我将我的代码展示出来。这个算法虽然看起来简单,但也耗费了我很多时间。实际上,许多看起来很简单的问题想要通过计算机进行实现,多多少少和我们想的会有很多出入。所以我的建议是,遇到好的想法和点子,多用代码敲出来进行实现。

单纯的空想并不能很好地帮助我们解决问题。

package com.xtit.theMath;

import java.util.Random;

public class MyRandom {

	public static void main(String[] args) {
		int j = 1;
		//String[] countryName = new String[]{"中国","越南","文莱","格鲁吉亚","亚美尼亚","挪威","荷兰","埃塞俄比亚","马里","马达加斯加","新西兰","北马里亚纳","关岛","新喀里多尼亚","墨西哥","伯利兹"};
		for(int i: getTheRandomArray(16)){
			System.out.print(i+"  ");
			if(j%4==0){
				System.out.println();
			}
			j++;
		}
//		for(int i:getTheRandomArray(16)){
//			System.out.print(countryName[i]+"  ");
//			if(j%4==0){
//				System.out.println();
//			}
//			j++;
//		}
		
	}
	
	
	public static int[] getTheRandomArray(int count){
		int array[] = new int[count];
		//首先 Random类中的nextInt(int bound)方法是产生一个从0到bound-1的一个随机数
		//为了防止第一个数是0而无法放入,所以我选择不使用数组默认的初始化方式,而是选择让所有的数值都为bound值。
		for(int i=0;i<count;i++){
			array[i] = count;
		}
		//这是一个标志,当flag的值为false时,
		//说明新产生的随机数没有与数组当中的数值重复,跳出while循环。
		boolean flag = false;
		//这是一个for循环进行赋值
		for(int i=0;i<count;i++){
			//这个变量的作用有必要说明一下
			//我们的flag一开始是false值,为了保证我们的while循环第一次可以执行,我们设置了这样一个变量。
			int start = 0;
			int temp = count ;
			while(/**三目表达式,这个地方体现了start变量的价值*/start==0?true:flag){
				//我们的测试循环很简单,一旦发现新生成的随机数和之前在数组中的随机数重复
				//马上重新生成并重新进行比较
				//当发现重复时我们会将flag设置为true值,这样while循环得以执行
				//当开始下一次的while循环时,我们就需要将flag设置为false值
				//这样是为了防止即使新产生的temp值并没有出现重复,由于flag依旧为true从而陷入死循环
				
				flag = false;
				temp = new Random().nextInt(count);
				for(int j=0;j<i;j++){
					if(temp ==array[j]){
						flag = true;
						break;
					}
				}
				//一次while循环结束后,对start变量进行递增
				start++;
			}
			//while循环执行结束后,说明新产生的temp随机变量并不会重复,将它放在数组中即可
			array[i]  = temp;
		}
		
		return array;
	}
}


猜你喜欢

转载自blog.csdn.net/qq1641530151/article/details/79860222