我们都知道如何产生一个随机数,但是我们是否能够产生一组互不相同的随机数呢?
这个方法的掌握对我们来说是十分重要的,我们都面对过随机分组的问题。当我们不知道该去如何随机分组时,我们可以编辑
一个程序来实现人员的随机安排。
这就要求我们产生一组互不相同的随机数,因为我们要以随机数的下标作为区分人员的标志。
闲话少说,我将我的代码展示出来。这个算法虽然看起来简单,但也耗费了我很多时间。实际上,许多看起来很简单的问题想要通过计算机进行实现,多多少少和我们想的会有很多出入。所以我的建议是,遇到好的想法和点子,多用代码敲出来进行实现。
单纯的空想并不能很好地帮助我们解决问题。
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; } }