一.JDK中提供的两种方式
1.Math类中的random()方法
public static double random()
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0 [0.0,1.0)。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。
2.Random类中的 nextInt()方法
public int nextInt()
返回一个随机数,所有 2的32次方个可能 int 值的生成概率(大致)相同。
public int nextInt(int n)
返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
nextInt 的常规协定是,伪随机地生成并返回指定范围中的一个 int 值。所有可能的 n 个 int 值的生成概率(大致)相同。
参数:
n - 要返回的随机数的范围。必须为正数。
返回:
随机数生成器序列中 0(包括)和 n(不包括)之间 [0,n) 均匀分布的 int 值。
抛出:
IllegalArgumentException - 如果 n 不是正数
StackOverFlow总结的的经典的回答:
二.随机获取制定范围的制定个数的随机数
上代码:
1 import java.util.HashSet; 2 import java.util.Random; 3 4 public class GenerateRandomNumber { 5 6 public static void main(String[] args) { 7 //一、JAVA中生成随机数的方式 8 //① 9 //int randomNumber = (int) Math.round(Math.random()*(max-min)+min); 10 11 //② 12 //long randomNum = System.currentTimeMillis(); 13 //int randomNumber = (int) randomNum%(max-min)+min; 14 15 //③ 16 //Random random = new Random(); 17 //int randomNumber = random.nextInt(max)%(max-min+1) + min; 18 19 //方法一:最简单最易理解的两重循环去重 20 // int[] reult1 = randomCommon(20, 50, 10); 21 // for (int i : reult1) { 22 // System.out.println(i); 23 // } 24 25 //方法二:利用HashSet的特征,只能存放不同的值 26 // HashSet<Integer> set = new HashSet<Integer>(); 27 // randomSet(20, 50, 10, set); 28 // for (int j : set) { 29 // System.out.println(j); 30 // } 31 32 //方法三:排除已随机到的数 33 int[] reult2 = randomArray(0, 20, 18); 34 // for (int i : reult2) { 35 // System.out.println(i); 36 // } 37 } 38 39 //二、随机给定范围内N个不重复的数 40 /** 41 * 方法一:最简单最易理解的两重循环去重 42 * 随机指定范围内N个不重复的数 43 * 最简单最基本的方法 44 * @param min 指定范围最小值 45 * @param max 指定范围最大值 46 * @param n 随机数个数 47 */ 48 public static int[] randomCommon(int min, int max, int n){ 49 if (n > (max - min + 1) || max < min) { 50 return null; 51 } 52 int[] result = new int[n]; 53 int count = 0; 54 while(count < n) { 55 int num = (int) (Math.random() * (max - min)) + min; 56 boolean flag = true; 57 for (int j = 0; j < n; j++) { 58 if(num == result[j]){ 59 flag = false; 60 break; 61 } 62 } 63 if(flag){ 64 result[count] = num; 65 count++; 66 } 67 } 68 return result; 69 } 70 71 /** 72 * 方法二:利用HashSet的特征,只能存放不同的值 73 * 随机指定范围内N个不重复的数 74 * 利用HashSet的特征,只能存放不同的值 75 * @param min 指定范围最小值 76 * @param max 指定范围最大值 77 * @param n 随机数个数 78 * @param HashSet<Integer> set 随机数结果集 79 */ 80 public static void randomSet(int min, int max, int n, HashSet<Integer> set) { 81 if (n > (max - min + 1) || max < min) { 82 return; 83 } 84 for (int i = 0; i < n; i++) { 85 // 调用Math.random()方法 86 int num = (int) (Math.random() * (max - min)) + min; 87 set.add(num);// 将不同的数存入HashSet中 88 } 89 int setSize = set.size(); 90 // 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小 91 if (setSize < n) { 92 randomSet(min, max, n - setSize, set);// 递归 93 } 94 } 95 96 /** 97 * 方法三:排除已随机到的数 98 * 随机指定范围内N个不重复的数 99 * 在初始化的无重复待选数组中随机产生一个数放入结果中, 100 * 将待选数组被随机到的数,用待选数组(len-1)下标对应的数替换 101 * 然后从len-2里随机产生下一个随机数,如此类推 102 * @param max 指定范围最大值 103 * @param min 指定范围最小值 104 * @param n 随机数个数 105 * @return int[] 随机数结果集 106 */ 107 public static int[] randomArray(int min,int max,int n){ 108 //min=20 max=40 n=10 109 int len = max-min+1; 110 111 if(max < min || n > len){ 112 return null; 113 } 114 115 //初始化给定范围的待选数组 116 int[] source = new int[len]; 117 for (int i = min; i < min+len; i++){ 118 source[i-min] = i; 119 } 120 //source 初始化之后就是min~max(包括首尾) 之间的所有数字的一个数组.[20,21...,10] 121 122 int[] result = new int[n]; 123 Random random = new Random(); 124 int index = 0; 125 for (int i = 0; i < result.length; i++) { 126 System.out.println("第"+i+"次循环"); 127 128 int randomInt = random.nextInt(); 129 int maxEffectiveArraySubScript = len--;//最大有效数组下标,数组中超过这个下标的值都没有用了... 130 //待选数组0到(len-2)随机一个下标 除数(maxEffectiveArraySubScript) 取余 范围为(0~maxEffectiveArraySubScript-1) 131 //即(0~maxEffectiveArraySubScript-1) <==> 0到(len-2) 132 index = Math.abs(randomInt % maxEffectiveArraySubScript ); 133 134 System.out.println("randomInt:"+randomInt+",原数组最大有效角标:"+maxEffectiveArraySubScript+",index:"+index); 135 System.out.println("原数组有效检索子数组:"); 136 printArray(source,maxEffectiveArraySubScript); 137 System.out.println(""); 138 139 //将随机到的数放入结果集 140 result[i] = source[index]; 141 System.out.println("找到的数为:"+result[i]); 142 //将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换 ,这样确保"有效检索子数组"中后面没有检索到的数据前移,下一次仍可能随机找到. 143 //因为每一次循环 原数组的有效长度都是-1的... 144 source[index] = source[len]; 145 146 System.out.println("原数组变成:"); 147 printArray(source); 148 System.out.println(""); 149 System.out.println("目标数组为:"); 150 printArray(result); 151 System.out.println(""); 152 } 153 return result; 154 } 155 156 public static void printArray(int [] intArray){ 157 for (int i = 0; i < intArray.length; i++) { 158 System.out.print(intArray[i]+","); 159 } 160 } 161 162 public static void printArray(int [] intArray,int maxArrayNum){ 163 for (int i = 0; i < maxArrayNum; i++) { 164 System.out.print(intArray[i]+","); 165 } 166 } 167 }
方法三:相对有点不好理解,我加上了打印内容.方便理解.
本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/7445054.html,如需转载请自行联系原作者