Java获取随机数获取制定范围指定个数不重复的随机数

java

一.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总结的的经典的回答:

https://stackoverflow.com/questions/363681/how-do-i-generate-random-integers-within-a-specific-range-in-java

二.随机获取制定范围的制定个数的随机数

上代码:

  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 }

 方法三:相对有点不好理解,我加上了打印内容.方便理解.

以上是 Java获取随机数获取制定范围指定个数不重复的随机数 的全部内容, 来源链接: utcz.com/z/392054.html

回到顶部