JAVA取随机数的三种方式:
- Math.random()
- System.currentTimeMillis()
- random.nextInt()
废话不多说,看代码:
1 /** 2 *取单个随机数 3 *Math.random()取10~100之间随机数 4 *Math.round()进行向上取整处理=>{3.5=>4}、{-3.5=>-3} 5 * 6 **/ 7 @Test 8 public void test1(){ 9 int max=100; 10 int min=10; 11 int randomNumber = (int) Math.round(Math.random()*(max-min)+min); 12 System.out.println("10~100之间随机数:"+randomNumber); 13 } 14 /** 15 * 取单个随机数 16 * System.currentTimeMillis()返回从1970年1月1号0点0分0秒到目前的一个long型的毫秒数 17 * 通过取模,限制随机数范围 18 * */ 19 @Test 20 public void test2(){ 21 int max=100; 22 int min=10; 23 long randomNum = System.currentTimeMillis(); 24 int randomNumber = (int)(randomNum%(max-min))+min; 25 System.out.println("10~100之间随机数:"+randomNumber); 26 } 27 /** 28 * 取单个随机数 29 * Random是一个随机数发生器 30 * 有两种构造函数:Random()使用当前时间即System.currentTimeMillis()作为发生器的种子 31 * Random(long seed)使用指定的seed作为发生器的种子 32 * 再通过nextInt()、 nextLong()、nextFloat()、nextDouble()等获得不同类型随机数 33 * */ 34 @Test 35 public void test3(){ 36 int max=100; 37 int min=10; 38 Random random = new Random(); 39 int randomNumber = random.nextInt(max)%(max-min+1) + min; 40 System.out.println("10~100之间随机数:"+randomNumber); 41 }
JAVA取N个随机数的三种方法:
- 双重循环去重法
- HashSet
- 排除已随机的数法
1 /** 2 * 取N个不同的随机数 3 * 1.双重循环去重法 4 * 进过第一重循环取值,另一重进行比较,去重 5 * */ 6 public int[] randomCommon1(int min ,int max , int n){ 7 int[] result = new int[n]; 8 if(n>max-min+1||min>max){ 9 return null; 10 } 11 int count = 0;//记录数量 12 while(count<n){ 13 int randomNumber = (int) Math.round(Math.random()*(max-min)+min); 14 boolean falg = true; 15 for(int i=0;i<n;i++){ 16 if(randomNumber == result[i]){ 17 falg = false; 18 break; 19 } 20 } 21 if(falg){ 22 result[count] = randomNumber; 23 count++; 24 } 25 } 26 return result; 27 } 28 /** 29 * 取N个不同的随机数 30 * 2.HashSet 31 * 使用HashSet只允许存放不同值原理 32 * */ 33 public void randomCommon2(int min,int max,int n,HashSet<Integer> set){ 34 if(n>max-min+1||min>max){ 35 return; 36 } 37 int randomNumber = (int) Math.round(Math.random()*(max-min)+min); 38 set.add(randomNumber); 39 if(set.size()<n){ 40 randomCommon2(min,max,n,set);//递归 41 } 42 } 43 /** 44 * 取N个不同的随机数 45 * 3.排除已随机的数 46 * */ 47 public static int[] randomArray(int min,int max,int n){ 48 int len = max-min+1; 49 50 if(max < min || n > len){ 51 return null; 52 } 53 54 //初始化给定范围的待选数组 55 int[] source = new int[len]; 56 for (int i = min; i < min+len; i++){ 57 source[i-min] = i; 58 } 59 60 int[] result = new int[n]; 61 Random rd = new Random(); 62 int index = 0; 63 for (int i = 0; i < result.length; i++) { 64 //待选数组0到(len-2)随机一个下标 65 index = Math.abs(rd.nextInt() % len); 66 len--;//始终保持取值范围缩小,并保持替换值在改变 67 //将随机到的数放入结果集 68 result[i] = source[index]; 69 //将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换 70 source[index] = source[len]; 71 } 72 return result; 73 } 74 75 @Test 76 public void Test(){ 77 //方法1: 78 int[] result1 = randomCommon1(0,10,5); 79 for(int i:result1){ 80 System.out.print(i+"#"); 81 } 82 System.out.println(); 83 //方法2: 84 HashSet<Integer> set = new HashSet<Integer>(); 85 randomCommon2(0,10,5,set); 86 for(int i:set){ 87 System.out.print(i+"#"); 88 } 89 System.out.println(); 90 //方法3: 91 int[] result3=randomArray(0,10,5); 92 for(int i:result3){ 93 System.out.print(i+"#"); 94 } 95 }
结果:
1 9#6#4#3#10# 2 1#4#8#9#10# 3 10#9#4#0#5#