需求
- 场景:生成彩票号码,即生成指定个数的指定范围的不重复随机数
- 例如:1-33范围内,生成16个不重复的号码,记录生成顺序
代码分析
import java.util.LinkedHashSet;
public class Test_Main {
/**
* 生成不重复的随机数
*
* @param max 最大范围
* @param min 最小范围
* @param len 生成随机数个数
*/
public static void getRandomNums(int max ,int min , int len){
/**
* 保证范围合法
*/
if(max < min || len > max-min+1){
return;
}
/**
* LinkedHashSet可以记录输入的数的顺序,并且数据不重复
*/
LinkedHashSet<Integer> res = new LinkedHashSet<>();
while(res.size() < len){
/**
* Math.random()可以生成指定范围的随机数,范围为[0,1)
* 结果乘以 最大最小值之差再减一的差值(占随机数范围的百分之多少)
* 再加上最小值,再取整数部分
* 可得到指定范围的随机数
*/
int num = (int) (Math.random()*(max-min+1)+min);
/**
* set保证了元素唯一性,一直循环添加,直到满足所需的随机数个数
*/
res.add(num);
}
/**
* 打印结果
*/
System.out.println(res.toString());
}
public static void main(String[] args) {
/**
* 输出结果
* [20, 24, 10, 30, 33, 3, 32, 7, 25, 16, 19, 13, 6, 23, 5, 17]
*/
getRandomNums(33,1,16);
}
}