读书人

JAVA生成不反复的随机数

发布时间: 2012-12-23 11:28:15 作者: rapoo

JAVA生成不重复的随机数

学习java的基本功:随机生成不重复的数字是一个简单的利用for循环就可以做出来的!下面说说几种思路;
第一种:利用for循环和random随机生成数字的方法就可以;注意怎么过滤重复;要用到数组;每添加一个数字都要和以前的数字相比较;如果有和以前相等的;则该次循环不算;可以用i--来取消该次循环;
第二种:上面那种做法虽然也可以得出结果;但是效率太低;可以利用java中一个hashset集合自动过滤重复;效率高
第三种:这种算法效率也很高;比如要生成7个1-36的随机不重复数字;我们可以把1-36这些数字存储在一个数组中;都知道要取出数组中的元素靠的是下标;比如arr[0],arr[5];等;如果能随机得到一个下标数字;就可以取出1-36中的任意一个数字了;关于重复问题我们可以每取出一个数字就把数组的最后一个数字替换刚取走的那个位置上;这样就不会出现重复的问题了;这样我们的for循环也只需要7次就够了;

?

?

附源代码如下:

public class Test???
{???
??
??? public static void main(String[] args)???
??? {???
??????? int[] arr = new int[10];???
??
??????? for (int i = 0; i < 10; i++)???
??????? {???
??????????? arr[i] = (int) (Math.random() * 40) + 1;???
??????????? for (int j = 0; j < i; j++)???
??????????? {???
??????????????? if (arr[j] == arr[i])???
??????????????? {???
??????????????????? i--;???
??????????????????? break;???
??????????????? }???
??????????? }???
??????? }???
??????? for (int i = 0; i < 10; i++)???
??????????? System.out.print(arr[i] + " ");???
??? }???
}???
??
??
b.????
??
Java code????
??
??
import?? java.util.*;????
public?? class?? Test????
{????
???????????
??????? public?? static?? void?? main(String[]?? args)????
??????? {????
??????????????? int?? n=40;????
??????????????? int[]?? num?? =?? new?? int[n];????
??????????????? for(int?? i=0;i <num.length;i++)????
??????????????????????? num[i]?? =?? i+1;????
??????????????? int[]?? arr?? =?? new?? int[10];????
??????????????? for(int?? i=0;i <arr.length;i++)????
??????????????? {????
??????????????????????? int?? r?? =(int)(Math.random()*n);????
??????????????????????? arr[i]=num[r];????
??????????????????????? num[r]=num[n-1];????
??????????????????????? n--;????
??????????????? }????
??????????????? for(int?? i=0;i <arr.length;i++)????
??????????????????????? System.out.print(arr[i]+"?? ");????
??????? }????
}????
??
??
??
??
c.????
??
Java code????
??
??
import?? java.util.*;????
public?? class?? Test????
{????
???????????
??????? public?? static?? void?? main(String[]?? args)????
??????? {????
??????????????? LinkedList <Integer>?? myList=?? new?? LinkedList <Integer> ();????
??????????????? int?? n=40;????
??????????????? for(int?? i=0;i <n;i++)????
??????????????????????? myList.add(i+1);????
??????????????? int[]?? arr?? =?? new?? int[10];????
??????????????? for(int?? i=0;i <arr.length;i++)????
??????????????? {????
??????????????????????? arr[i]=myList.remove((int)(Math.random()*n));????
??????????????????????? n--;????
??????????????? }????
??????????????? for(int?? i=0;i <arr.length;i++)????
??????????????? {????
??????????????????????? System.out.print(arr[i]+"?? ");????
??????????????? }????
??????? }????
}????
??
??
??
??
d.????
??
Java code????
??
??
import?? java.util.*;????
public?? class?? Test????
{????
???????????
??????? public?? static?? void?? main(String[]?? args)????
??????? {????
??????????????? Set <Integer>?? mySet?? =?? new?? LinkedHashSet <Integer> ();????
??????????????? while(mySet.size() <10)????
??????????????? {????
??????????????????????? mySet.add((int)(Math.random()*40+1));????
??????????????? }????
??????????????? for(Integer?? i:mySet)????
??????????????? {????
??????????????????????? System.out.print(i+"?? ");????
??????????????? }????
??????? }????
??
}??

public class Test?
{?

??? public static void main(String[] args)?
??? {?
??????? int[] arr = new int[10];?

??????? for (int i = 0; i < 10; i++)?
??????? {?
??????????? arr[i] = (int) (Math.random() * 40) + 1;?
??????????? for (int j = 0; j < i; j++)?
??????????? {?
??????????????? if (arr[j] == arr[i])?
??????????????? {?
??????????????????? i--;?
??????????????????? break;?
??????????????? }?
??????????? }?
??????? }?
??????? for (int i = 0; i < 10; i++)?
??????????? System.out.print(arr[i] + " ");?
??? }?
}?


b.?

Java code?


import?? java.util.*;?
public?? class?? Test?
{?
????????
??????? public?? static?? void?? main(String[]?? args)?
??????? {?
??????????????? int?? n=40;?
??????????????? int[]?? num?? =?? new?? int[n];?
??????????????? for(int?? i=0;i <num.length;i++)?
??????????????????????? num[i]?? =?? i+1;?
??????????????? int[]?? arr?? =?? new?? int[10];?
??????????????? for(int?? i=0;i <arr.length;i++)?
??????????????? {?
??????????????????????? int?? r?? =(int)(Math.random()*n);?
??????????????????????? arr[i]=num[r];?
??????????????????????? num[r]=num[n-1];?
??????????????????????? n--;?
??????????????? }?
??????????????? for(int?? i=0;i <arr.length;i++)?
??????????????????????? System.out.print(arr[i]+"?? ");?
??????? }?
}?




c.?

Java code?


import?? java.util.*;?
public?? class?? Test?
{?
????????
??????? public?? static?? void?? main(String[]?? args)?
??????? {?
??????????????? LinkedList <Integer>?? myList=?? new?? LinkedList <Integer> ();?
??????????????? int?? n=40;?
??????????????? for(int?? i=0;i <n;i++)?
??????????????????????? myList.add(i+1);?
??????????????? int[]?? arr?? =?? new?? int[10];?
??????????????? for(int?? i=0;i <arr.length;i++)?
??????????????? {?
??????????????????????? arr[i]=myList.remove((int)(Math.random()*n));?
??????????????????????? n--;?
??????????????? }?
??????????????? for(int?? i=0;i <arr.length;i++)?
??????????????? {?
??????????????????????? System.out.print(arr[i]+"?? ");?
??????????????? }?
??????? }?
}?




d.?

Java code?


import?? java.util.*;?
public?? class?? Test?
{?
????????
??????? public?? static?? void?? main(String[]?? args)?
??????? {?
??????????????? Set <Integer>?? mySet?? =?? new?? LinkedHashSet <Integer> ();?
??????????????? while(mySet.size() <10)?
??????????????? {?
??????????????????????? mySet.add((int)(Math.random()*40+1));?
??????????????? }?
??????????????? for(Integer?? i:mySet)?
??????????????? {?
??????????????????????? System.out.print(i+"?? ");?
??????????????? }?
??????? }?

}?

Java代码?
第一种方法,在一个待选数组中随机产生一个数,然后把他放到待选数组的最后,然后从length-1里随机产生下一个随机数,如此类推???
??
public static int[] randoms()???
{???
Random r = new Random();???
??
int temp1,temp2;???
int send[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};???
int len = send.length;???
int returnValue[] = new int[22];???
for(int i=0;i<22;i++)???
{???
temp1 = Math.abs(r.nextInt())% len;???
returnValue[i] = send[temp1];???
temp2 = send[temp1];???
send[temp1] = send[len-1];???
send[len-1] = temp2;???
len--;???
}???
return returnValue;???
}???
}???
??
??
方法二:还是一个固定的无重复的数组,然后把这个数组随机调换位置,多次之后这个数组就是一个无重复的随机数组了。???
??
public static int[] random2()???
{???
?? int send[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};???
?? int temp1,temp2,temp3;???
?? Random r = new Random();???
?? for(int i=0;i<send.length;i++) //随机交换send.length次???
?? {???
??? temp1 = Math.abs(r.nextInt())%(send.length-1); //随机产生一个位置???
??? temp2 = Math.abs(r.nextInt())%(send.length-1); //随机产生另一个位置???
??? if(temp1 != temp2)???
??? {???
???? temp3 = send[temp1];???
???? send[temp1] = send[temp2];???
???? send[temp2] = temp3;???
??? }???
?? }???
?? return send;???
}??

读书人网 >编程

热点推荐